ZGlmZiAtLWdpdCBhL3NyYy9NYWtlZmlsZSBiL3NyYy9NYWtlZmlsZQppbmRleCA4ZGQxYmUzLi44MTBkZDdiIDEwMDY0NAotLS0gYS9zcmMvTWFrZWZpbGUKKysrIGIvc3JjL01ha2VmaWxlCkBAIC01MzIsOSArNTMyLDEyIEBACiAKICMgUFJPRklMSU5HIC0gVW5jb21tZW50IHRoZSBuZXh0IHR3byBsaW5lcyB0byBkbyBwcm9maWxpbmcgd2l0aCBnY2MgYW5kIGdwcm9mLgogIyBNaWdodCBub3Qgd29yayB3aXRoIEdVSSBvciBQZXJsLgorIyBGb3IgdW5rbm93biByZWFzb25zIGFkZGluZyAiLWxjIiBmaXhlcyBhIGxpbmtpbmcgcHJvYmxlbSB3aXRoIEdDQy4gIFRoYXQncworIyBwcm9iYWJseSBhIGJ1ZyBpbiB0aGUgIi1wZyIgaW1wbGVtZW50YXRpb24uCiAjIE5lZWQgdG8gcmVjb21waWxlIGV2ZXJ5dGhpbmcgYWZ0ZXIgY2hhbmdpbmcgdGhpczogIm1ha2UgY2xlYW4iICJtYWtlIi4KICNQUk9GSUxFX0NGTEFHUyA9IC1wZyAtZwogI1BST0ZJTEVfTElCUyA9IC1wZworI1BST0ZJTEVfTElCUyA9IC1wZyAtbGMKIAogIyBNRU1PUlkgTEVBSyBERVRFQ1RJT04KICMgUmVxdWlyZXMgaW5zdGFsbGluZyB0aGUgY2NtYWxsb2MgbGlicmFyeS4KZGlmZiAtLWdpdCBhL3NyYy9idWZmZXIuYyBiL3NyYy9idWZmZXIuYwppbmRleCBmMjUyNDg5Li4xMTkwMTE3IDEwMDY0NAotLS0gYS9zcmMvYnVmZmVyLmMKKysrIGIvc3JjL2J1ZmZlci5jCkBAIC04Miw3ICs4Miw3IEBACiAJCQkJCSYmIChjdXJidWYtPmJfZmxhZ3MgJiBCRl9ORVZFUkxPQURFRCkpCiAJY3VyYnVmLT5iX3Bfcm8gPSBUUlVFOwogCi0gICAgaWYgKG1sX29wZW4oKSA9PSBGQUlMKQorICAgIGlmIChtbF9vcGVuKGN1cmJ1ZikgPT0gRkFJTCkKICAgICB7CiAJLyoKIAkgKiBUaGVyZSBNVVNUIGJlIGEgbWVtZmlsZSwgb3RoZXJ3aXNlIHdlIGNhbid0IGRvIGFueXRoaW5nCkBAIC0xNTA1LDYgKzE1MDUsOCBAQAogICAgICAqIGJ1ZmZlci4JT3RoZXJ3aXNlOiBOZWVkIHRvIGFsbG9jYXRlIGEgbmV3IGJ1ZmZlciBzdHJ1Y3R1cmUuCiAgICAgICoKICAgICAgKiBUaGlzIGlzIHRoZSBPTkxZIHBsYWNlIHdoZXJlIGEgbmV3IGJ1ZmZlciBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIQorICAgICAqIChBIHNwZWxsIGZpbGUgYnVmZmVyIGlzIGFsbG9jYXRlZCBpbiBzcGVsbC5jLCBidXQgdGhhdCdzIG5vdCBhIG5vcm1hbAorICAgICAqIGJ1ZmZlci4pCiAgICAgICovCiAgICAgYnVmID0gTlVMTDsKICAgICBpZiAoKGZsYWdzICYgQkxOX0NVUkJVRikKQEAgLTUxOTEsNyArNTE5Myw3IEBACiAgICAgY3Vyd2luLT53X2J1ZmZlciA9IG5ld2J1ZjsKICNlbmRpZgogCi0gICAgaWYgKG1sX29wZW4oKSA9PSBPSworICAgIGlmIChtbF9vcGVuKGN1cmJ1ZikgPT0gT0sKIAkgICAgJiYgcmVhZGZpbGUoYnVmLT5iX2ZmbmFtZSwgYnVmLT5iX2ZuYW1lLAogCQkJCSAgKGxpbmVucl9UKTAsIChsaW5lbnJfVCkwLCAobGluZW5yX1QpTUFYTE5VTSwKIAkJCQkJICAgICZlYSwgUkVBRF9ORVcgfCBSRUFEX0RVTU1ZKSA9PSBPSykKZGlmZiAtLWdpdCBhL3NyYy9lZGl0LmMgYi9zcmMvZWRpdC5jCmluZGV4IDIzZGQ1N2UuLmMwMzdkMWYgMTAwNjQ0Ci0tLSBhL3NyYy9lZGl0LmMKKysrIGIvc3JjL2VkaXQuYwpAQCAtOTg3LDYgKzk4NywxNSBAQAogCWNhc2UgS19JR05PUkU6CS8qIFNvbWV0aGluZyBtYXBwZWQgdG8gbm90aGluZyAqLwogCSAgICBicmVhazsKIAorI2lmZGVmIEZFQVRfR1VJX1czMgorCSAgICAvKiBPbiBXaW4zMiBpZ25vcmUgPE0tRjQ+LCB3ZSBnZXQgaXQgd2hlbiBjbG9zaW5nIHRoZSB3aW5kb3cgd2FzCisJICAgICAqIGNhbmNlbGxlZC4gKi8KKwljYXNlIEtfRjQ6CisJICAgIGlmIChtb2RfbWFzayAhPSBNT0RfTUFTS19BTFQpCisJCWdvdG8gbm9ybWFsY2hhcjsKKwkgICAgYnJlYWs7CisjZW5kaWYKKwogI2lmZGVmIEZFQVRfR1VJCiAJY2FzZSBLX1ZFUl9TQ1JPTExCQVI6CiAJICAgIGluc19zY3JvbGwoKTsKZGlmZiAtLWdpdCBhL3NyYy9ldmFsLmMgYi9zcmMvZXZhbC5jCmluZGV4IGVlZjg2NWEuLjQ4MjM1OTMgMTAwNjQ0Ci0tLSBhL3NyYy9ldmFsLmMKKysrIGIvc3JjL2V2YWwuYwpAQCAtNjU0LDcgKzY1NCw2IEBACiBzdGF0aWMgaW50IGhhbmRsZV9zdWJzY3JpcHQgX19BUkdTKChjaGFyX3UgKiphcmcsIHR5cHZhbF9UICpyZXR0diwgaW50IGV2YWx1YXRlLCBpbnQgdmVyYm9zZSkpOwogc3RhdGljIHR5cHZhbF9UICphbGxvY190diBfX0FSR1MoKHZvaWQpKTsKIHN0YXRpYyB0eXB2YWxfVCAqYWxsb2Nfc3RyaW5nX3R2IF9fQVJHUygoY2hhcl91ICpzdHJpbmcpKTsKLXN0YXRpYyB2b2lkIGZyZWVfdHYgX19BUkdTKCh0eXB2YWxfVCAqdmFycCkpOwogc3RhdGljIHZvaWQgaW5pdF90diBfX0FSR1MoKHR5cHZhbF9UICp2YXJwKSk7CiBzdGF0aWMgbG9uZyBnZXRfdHZfbnVtYmVyIF9fQVJHUygodHlwdmFsX1QgKnZhcnApKTsKIHN0YXRpYyBsaW5lbnJfVCBnZXRfdHZfbG51bSBfX0FSR1MoKHR5cHZhbF9UICphcmd2YXJzKSk7CkBAIC0xMzIzLDcgKzEzMjIsOSBAQAogI2VuZGlmCiAKIC8qCi0gKiBUb3AgbGV2ZWwgZXZhbHVhdGlvbiBmdW5jdGlvbiwgCisgKiBUb3AgbGV2ZWwgZXZhbHVhdGlvbiBmdW5jdGlvbi4KKyAqIFJldHVybnMgYW4gYWxsb2NhdGVkIHR5cHZhbF9UIHdpdGggdGhlIHJlc3VsdC4KKyAqIFJldHVybnMgTlVMTCB3aGVuIHRoZXJlIGlzIGFuIGVycm9yLgogICovCiAgICAgdHlwdmFsX1QgKgogZXZhbF9leHByKGFyZywgbmV4dGNtZCkKQEAgLTEzMzMsMTMgKzEzMzQsMTAgQEAKICAgICB0eXB2YWxfVAkqdHY7CiAKICAgICB0diA9ICh0eXB2YWxfVCAqKWFsbG9jKHNpemVvZih0eXB2YWxfVCkpOwotICAgIGlmICghdHYpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoZXZhbDAoYXJnLCB0diwgbmV4dGNtZCwgVFJVRSkgPT0gRkFJTCkKKyAgICBpZiAodHYgIT0gTlVMTCAmJiBldmFsMChhcmcsIHR2LCBuZXh0Y21kLCBUUlVFKSA9PSBGQUlMKQogICAgIHsKIAl2aW1fZnJlZSh0dik7Ci0JcmV0dXJuIE5VTEw7CisJdHYgPSBOVUxMOwogICAgIH0KIAogICAgIHJldHVybiB0djsKQEAgLTEzOTMwLDcgKzEzOTI4LDcgQEAKIAkgICAgLyogQ2hlY2sgdGhlIGFyZ3VtZW50IGZvciBzcGVsbGluZy4gKi8KIAkgICAgd2hpbGUgKCpzdHIgIT0gTlVMKQogCSAgICB7Ci0JCWxlbiA9IHNwZWxsX2NoZWNrKGN1cndpbiwgc3RyLCAmYXR0ciwgJmNhcGNvbCk7CisJCWxlbiA9IHNwZWxsX2NoZWNrKGN1cndpbiwgc3RyLCAmYXR0ciwgJmNhcGNvbCwgRkFMU0UpOwogCQlpZiAoYXR0ciAhPSBITEZfQ09VTlQpCiAJCXsKIAkJICAgIHdvcmQgPSBzdHI7CkBAIC0xMzk5Niw3ICsxMzk5NCw3IEBACiAJZWxzZQogCSAgICBtYXhjb3VudCA9IDI1OwogCi0Jc3BlbGxfc3VnZ2VzdF9saXN0KCZnYSwgc3RyLCBtYXhjb3VudCwgbmVlZF9jYXBpdGFsKTsKKwlzcGVsbF9zdWdnZXN0X2xpc3QoJmdhLCBzdHIsIG1heGNvdW50LCBuZWVkX2NhcGl0YWwsIEZBTFNFKTsKIAogCWZvciAoaSA9IDA7IGkgPCBnYS5nYV9sZW47ICsraSkKIAl7CkBAIC0xNTkwNCw3ICsxNTkwMiw3IEBACiAvKgogICogRnJlZSB0aGUgbWVtb3J5IGZvciBhIHZhcmlhYmxlIHR5cGUtdmFsdWUuCiAgKi8KLSAgICBzdGF0aWMgdm9pZAorICAgIHZvaWQKIGZyZWVfdHYodmFycCkKICAgICB0eXB2YWxfVCAqdmFycDsKIHsKQEAgLTE2OTEwLDcgKzE2OTA4LDEwIEBACiAgICAgaWYgKHJldCAhPSBGQUlMICYmIGdhLmdhX2RhdGEgIT0gTlVMTCkKICAgICB7CiAJaWYgKGVhcC0+Y21kaWR4ID09IENNRF9lY2hvbXNnKQorCXsKIAkgICAgTVNHX0FUVFIoZ2EuZ2FfZGF0YSwgZWNob19hdHRyKTsKKwkgICAgb3V0X2ZsdXNoKCk7CisJfQogCWVsc2UgaWYgKGVhcC0+Y21kaWR4ID09IENNRF9lY2hvZXJyKQogCXsKIAkgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBhYm9ydCBmb2xsb3dpbmcgY29tbWFuZHMsIHJlc3RvcmUgZGlkX2Vtc2cuICovCmRpZmYgLS1naXQgYS9zcmMvZXhfY21kcy5jIGIvc3JjL2V4X2NtZHMuYwppbmRleCAwMDY3MzNjLi5jNGZkMGM0IDEwMDY0NAotLS0gYS9zcmMvZXhfY21kcy5jCisrKyBiL3NyYy9leF9jbWRzLmMKQEAgLTExMSw5ICsxMTEsOSBAQAogCSAgICBJT2J1ZmZbbGVuKytdID0gJyAnOwogCUlPYnVmZltsZW4rK10gPSAnPCc7CiAJaWYgKHV0Zl9pc2NvbXBvc2luZyhjKQotI2lmZGVmIFVTRV9HVUkKKyMgaWZkZWYgVVNFX0dVSQogCQkmJiAhZ3VpLmluX3VzZQotI2VuZGlmCisjIGVuZGlmCiAJCSkKIAkgICAgSU9idWZmW2xlbisrXSA9ICcgJzsgLyogZHJhdyBjb21wb3NpbmcgY2hhciBvbiB0b3Agb2YgYSBzcGFjZSAqLwogCWxlbiArPSAoKm1iX2NoYXIyYnl0ZXMpKGMsIElPYnVmZiArIGxlbik7CmRpZmYgLS1naXQgYS9zcmMvZXhfY21kcy5oIGIvc3JjL2V4X2NtZHMuaAppbmRleCA0YzRhYjZmLi5hMTVlZDQ2IDEwMDY0NAotLS0gYS9zcmMvZXhfY21kcy5oCisrKyBiL3NyYy9leF9jbWRzLmgKQEAgLTE4Nyw2ICsxODcsOCBAQAogCQkJRVhUUkF8VFJMQkFSfE5PVFJMQ09NfFVTRUNUUkxWfENNRFdJTiksCiBFWChDTURfY2FiY2xlYXIsCSJjYWJjbGVhciIsCWV4X2FiY2xlYXIsCiAJCQlFWFRSQXxUUkxCQVJ8Q01EV0lOKSwKK0VYKENNRF9jYWRkZXhwciwJImNhZGRleHByIiwJZXhfY2V4cHIsCisJCQlORUVEQVJHfFdPUkQxfE5PVFJMQ09NfFRSTEJBUnxCQU5HKSwKIEVYKENNRF9jYWRkZmlsZSwJImNhZGRmaWxlIiwJZXhfY2ZpbGUsCiAJCQlUUkxCQVJ8RklMRTEpLAogRVgoQ01EX2NhbGwsCQkiY2FsbCIsCQlleF9jYWxsLApAQCAtMzk0LDcgKzM5Niw3IEBACiBFWChDTURfZnVuY3Rpb24sCSJmdW5jdGlvbiIsCWV4X2Z1bmN0aW9uLAogCQkJRVhUUkF8QkFOR3xDTURXSU4pLAogRVgoQ01EX2dsb2JhbCwJCSJnbG9iYWwiLAlleF9nbG9iYWwsCi0JCQlSQU5HRXxXSE9MRUZPTER8QkFOR3xFWFRSQXxERkxBTEx8Q01EV0lOKSwKKwkJCVJBTkdFfFdIT0xFRk9MRHxCQU5HfEVYVFJBfERGTEFMTHxTQk9YT0t8Q01EV0lOKSwKIEVYKENNRF9nb3RvLAkJImdvdG8iLAkJZXhfZ290bywKIAkJCVJBTkdFfE5PVEFEUnxDT1VOVHxUUkxCQVJ8U0JPWE9LfENNRFdJTiksCiBFWChDTURfZ3JlcCwJCSJncmVwIiwJCWV4X21ha2UsCkBAIC03NjgsNyArNzcwLDcgQEAKIEVYKENNRF9zcGVsbHdyb25nLAkic3BlbGx3cm9uZyIsCWV4X3NwZWxsLAogCQkJQkFOR3xSQU5HRXxOT1RBRFJ8TkVFREFSR3xFWFRSQXxUUkxCQVIpLAogRVgoQ01EX3NwZWxsZHVtcCwJInNwZWxsZHVtcCIsCWV4X3NwZWxsZHVtcCwKLQkJCVRSTEJBUiksCisJCQlCQU5HfFRSTEJBUiksCiBFWChDTURfc3BlbGxyZXBhbGwsCSJzcGVsbHJlcGFsbCIsCWV4X3NwZWxscmVwYWxsLAogCQkJVFJMQkFSKSwKIEVYKENNRF9zcHJldmlvdXMsCSJzcHJldmlvdXMiLAlleF9wcmV2aW91cywKZGlmZiAtLWdpdCBhL3NyYy9leF9kb2NtZC5jIGIvc3JjL2V4X2RvY21kLmMKaW5kZXggMWViMmJiOS4uZTE1YzZjNSAxMDA2NDQKLS0tIGEvc3JjL2V4X2RvY21kLmMKKysrIGIvc3JjL2V4X2RvY21kLmMKQEAgLTgyMzQsOCArODIzNCwxMSBAQAogCQlmYWlsZWQgPSBUUlVFOwogCSAgICBpZiAocHV0X2xpbmUoZmQsICJkb2F1dG9hbGwgU2Vzc2lvbkxvYWRQb3N0IikgPT0gRkFJTCkKIAkJZmFpbGVkID0gVFJVRTsKLQkgICAgaWYgKHB1dF9saW5lKGZkLCAidW5sZXQgU2Vzc2lvbkxvYWQiKSA9PSBGQUlMKQotCQlmYWlsZWQgPSBUUlVFOworCSAgICBpZiAoZWFwLT5jbWRpZHggPT0gQ01EX21rc2Vzc2lvbikKKwkgICAgeworCQlpZiAocHV0X2xpbmUoZmQsICJ1bmxldCBTZXNzaW9uTG9hZCIpID09IEZBSUwpCisJCSAgICBmYWlsZWQgPSBUUlVFOworCSAgICB9CiAJfQogI2VuZGlmCiAJaWYgKHB1dF9saW5lKGZkLCAiXCIgdmltOiBzZXQgZnQ9dmltIDoiKSA9PSBGQUlMKQpkaWZmIC0tZ2l0IGEvc3JjL2V4X2dldGxuLmMgYi9zcmMvZXhfZ2V0bG4uYwppbmRleCAzMzVmMmE0Li45NTEwOTUzIDEwMDY0NAotLS0gYS9zcmMvZXhfZ2V0bG4uYworKysgYi9zcmMvZXhfZ2V0bG4uYwpAQCAtNjQ1LDggKzY0NSw4IEBACiAKIAkJLyoKIAkJICogUmVwbGFjZSB0aGUgY29tbWFuZCBsaW5lIHdpdGggdGhlIHJlc3VsdCBvZiBhbiBleHByZXNzaW9uLgotCQkgKiBOZWVkIHRvIHNhdmUgdGhlIGN1cnJlbnQgY29tbWFuZCBsaW5lLCB0byBiZSBhYmxlIHRvIGVudGVyCi0JCSAqIGEgbmV3IG9uZS4uLgorCQkgKiBOZWVkIHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhlIGN1cnJlbnQgY29tbWFuZCBsaW5lLCB0byBiZQorCQkgKiBhYmxlIHRvIGVudGVyIGEgbmV3IG9uZS4uLgogCQkgKi8KIAkJaWYgKGNjbGluZS5jbWRwb3MgPT0gY2NsaW5lLmNtZGxlbikKIAkJICAgIG5ld19jbWRwb3MgPSA5OTk5OTsJLyoga2VlcCBpdCBhdCB0aGUgZW5kICovCkBAIC02NTgsOCArNjU4LDE3IEBACiAJCXJlc3RvcmVfY21kbGluZSgmc2F2ZV9jY2xpbmUpOwogCQlpZiAoYyA9PSAnPScpCiAJCXsKKwkJICAgIC8qIE5lZWQgdG8gc2F2ZSBhbmQgcmVzdG9yZSBjY2xpbmUuICBBbmQgZ28gaW50byB0aGUKKwkJICAgICAqIHNhbmRib3ggdG8gYXZvaWQgbmFzdHkgdGhpbmdzIGxpa2UgZ29pbmcgdG8gYW5vdGhlcgorCQkgICAgICogYnVmZmVyIHdoZW4gZXZhbHVhdGluZyBhbiBleHByZXNzaW9uLiAqLwogCQkgICAgc2F2ZV9jbWRsaW5lKCZzYXZlX2NjbGluZSk7CisjaWZkZWYgSEFWRV9TQU5EQk9YCisJCSAgICArK3NhbmRib3g7CisjZW5kaWYKIAkJICAgIHAgPSBnZXRfZXhwcl9saW5lKCk7CisjaWZkZWYgSEFWRV9TQU5EQk9YCisJCSAgICAtLXNhbmRib3g7CisjZW5kaWYKIAkJICAgIHJlc3RvcmVfY21kbGluZSgmc2F2ZV9jY2xpbmUpOwogCiAJCSAgICBpZiAocCAhPSBOVUxMICYmIHJlYWxsb2NfY21kYnVmZigoaW50KVNUUkxFTihwKSArIDEpID09IE9LKQpAQCAtMTE5Miw2ICsxMjAxLDE4IEBACiAJY2FzZSBLX0lHTk9SRToKIAkJZ290byBjbWRsaW5lX25vdF9jaGFuZ2VkOwkvKiBJZ25vcmUgbW91c2UgKi8KIAorI2lmZGVmIEZFQVRfR1VJX1czMgorCSAgICAvKiBPbiBXaW4zMiBpZ25vcmUgPE0tRjQ+LCB3ZSBnZXQgaXQgd2hlbiBjbG9zaW5nIHRoZSB3aW5kb3cgd2FzCisJICAgICAqIGNhbmNlbGxlZC4gKi8KKwljYXNlIEtfRjQ6CisJICAgIGlmIChtb2RfbWFzayA9PSBNT0RfTUFTS19BTFQpCisJICAgIHsKKwkJcmVkcmF3Y21kKCk7CSAgICAvKiBzb21laG93IHRoZSBjbWRsaW5lIGlzIGNsZWFyZWQgKi8KKwkJZ290byBjbWRsaW5lX25vdF9jaGFuZ2VkOworCSAgICB9CisJICAgIGJyZWFrOworI2VuZGlmCisKICNpZmRlZiBGRUFUX01PVVNFCiAJY2FzZSBLX01JRERMRURSQUc6CiAJY2FzZSBLX01JRERMRVJFTEVBU0U6CmRpZmYgLS1naXQgYS9zcmMvZmVhdHVyZS5oIGIvc3JjL2ZlYXR1cmUuaAppbmRleCA2OWE3ODRlLi5lZmU3OTE1IDEwMDY0NAotLS0gYS9zcmMvZmVhdHVyZS5oCisrKyBiL3NyYy9mZWF0dXJlLmgKQEAgLTEyNyw2ICsxMjcsMTUgQEAKICNlbmRpZgogCiAvKgorICogTWVzc2FnZSBoaXN0b3J5IGlzIGZpeGVkIGF0IDEwMCBtZXNzYWdlLCAyMCBmb3IgdGhlIHRpbnkgdmVyc2lvbi4KKyAqLworI2lmZGVmIEZFQVRfU01BTEwKKyMgZGVmaW5lIE1BWF9NU0dfSElTVF9MRU4gMTAwCisjZWxzZQorIyBkZWZpbmUgTUFYX01TR19ISVNUX0xFTiAyMAorI2VuZGlmCisKKy8qCiAgKiAranVtcGxpc3QJCUp1bXBsaXN0LCBDVFJMLU8gYW5kIENUUkwtSSBjb21tYW5kcy4KICAqLwogI2lmZGVmIEZFQVRfU01BTEwKZGlmZiAtLWdpdCBhL3NyYy9maWxlaW8uYyBiL3NyYy9maWxlaW8uYwppbmRleCBlMDVmYjU0Li5jNWM5MjYyIDEwMDY0NAotLS0gYS9zcmMvZmlsZWlvLmMKKysrIGIvc3JjL2ZpbGVpby5jCkBAIC02NDA1LDcgKzY0MDUsNyBAQAogCQkvKiBPcGVuIHRoZSBtZW1saW5lLiAqLwogCQljdXJidWYgPSBzYXZlYnVmOwogCQljdXJ3aW4tPndfYnVmZmVyID0gc2F2ZWJ1ZjsKLQkJc2F2ZWQgPSBtbF9vcGVuKCk7CisJCXNhdmVkID0gbWxfb3BlbihjdXJidWYpOwogCQljdXJidWYgPSBidWY7CiAJCWN1cndpbi0+d19idWZmZXIgPSBidWY7CiAJICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9nbG9iYWxzLmggYi9zcmMvZ2xvYmFscy5oCmluZGV4IDhjMjExMDUuLmMyMjQ2NmMgMTAwNjQ0Ci0tLSBhL3NyYy9nbG9iYWxzLmgKKysrIGIvc3JjL2dsb2JhbHMuaApAQCAtNTI4LDcgKzUyOCwxMiBAQAogCQkJCS8qIGZpcnN0IE5PX1NDUkVFTiwgdGhlbiBOT19CVUZGRVJTIGFuZCB0aGVuCiAJCQkJICogc2V0IHRvIDAgd2hlbiBzdGFydGluZyB1cCBmaW5pc2hlZCAqLwogRVhURVJOIGludAlleGl0aW5nIElOSVQoPSBGQUxTRSk7Ci0JCQkJLyogVFJVRSB3aGVuIGFiYW5kb25pbmcgVmltICovCisJCQkJLyogVFJVRSB3aGVuIHBsYW5uaW5nIHRvIGV4aXQgVmltLiAgTWlnaHQKKwkJCQkgKiBzdGlsbCBrZWVwIG9uIHJ1bm5pbmcgaWYgdGhlcmUgaXMgYSBjaGFuZ2VkCisJCQkJICogYnVmZmVyLiAqLworRVhURVJOIGludAlyZWFsbHlfZXhpdGluZyBJTklUKD0gRkFMU0UpOworCQkJCS8qIFRSVUUgd2hlbiB3ZSBhcmUgc3VyZSB0byBleGl0LCBlLmcuLCBhZnRlcgorCQkJCSAqIGEgZGVhZGx5IHNpZ25hbCAqLwogRVhURVJOIGludAlmdWxsX3NjcmVlbiBJTklUKD0gRkFMU0UpOwogCQkJCS8qIFRSVUUgd2hlbiBkb2luZyBmdWxsLXNjcmVlbiBvdXRwdXQKIAkJCQkgKiBvdGhlcndpc2Ugb25seSB3cml0aW5nIHNvbWUgbWVzc2FnZXMgKi8KZGlmZiAtLWdpdCBhL3NyYy9ndWlfZ3RrX3gxMS5jIGIvc3JjL2d1aV9ndGtfeDExLmMKaW5kZXggMTUwMmUwYy4uODRjNWZlNCAxMDA2NDQKLS0tIGEvc3JjL2d1aV9ndGtfeDExLmMKKysrIGIvc3JjL2d1aV9ndGtfeDExLmMKQEAgLTIzMjgsNiArMjMyOCw3IEBACiAgICAgdmltX3N0cm5jcHkoSU9idWZmLAogCQkgICAgXygiVmltOiBSZWNlaXZlZCBcImRpZVwiIHJlcXVlc3QgZnJvbSBzZXNzaW9uIG1hbmFnZXJcbiIpLAogCSAgICBJT1NJWkUgLSAxKTsKKyAgICBkZWFkbHlfZXhpdCA9IFRSVUU7CiAgICAgcHJlc2VydmVfZXhpdCgpOwogfQogCmRpZmYgLS1naXQgYS9zcmMvaGFzaHRhYmxlLmMgYi9zcmMvaGFzaHRhYmxlLmMKaW5kZXggOTA0YmU0Ny4uMDY2ZjBmMyAxMDA2NDQKLS0tIGEvc3JjL2hhc2h0YWJsZS5jCisrKyBiL3NyYy9oYXNodGFibGUuYwpAQCAtODYsNiArODYsMzEgQEAKIH0KIAogLyoKKyAqIEZyZWUgdGhlIGFycmF5IG9mIGEgaGFzaCB0YWJsZSBhbmQgYWxsIHRoZSBrZXlzIGl0IGNvbnRhaW5zLiAgVGhlIGtleXMgbXVzdAorICogaGF2ZSBiZWVuIGFsbG9jYXRlZC4gICJvZmYiIGlzIHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGFsbG9jYXRlCisgKiBtZW1vcnkgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBrZXkgKGl0J3MgYWx3YXlzIHBvc2l0aXZlKS4KKyAqLworICAgIHZvaWQKK2hhc2hfY2xlYXJfYWxsKGh0LCBvZmYpCisgICAgaGFzaHRhYl9UCSpodDsKKyAgICBpbnQJCW9mZjsKK3sKKyAgICBpbnQJCXRvZG87CisgICAgaGFzaGl0ZW1fVAkqaGk7CisKKyAgICB0b2RvID0gaHQtPmh0X3VzZWQ7CisgICAgZm9yIChoaSA9IGh0LT5odF9hcnJheTsgdG9kbyA+IDA7ICsraGkpCisgICAgeworCWlmICghSEFTSElURU1fRU1QVFkoaGkpKQorCXsKKwkgICAgdmltX2ZyZWUoaGktPmhpX2tleSAtIG9mZik7CisJICAgIC0tdG9kbzsKKwl9CisgICAgfQorICAgIGhhc2hfY2xlYXIoaHQpOworfQorCisvKgogICogRmluZCAia2V5IiBpbiBoYXNodGFibGUgImh0Ii4gICJrZXkiIG11c3Qgbm90IGJlIE5VTEwuCiAgKiBBbHdheXMgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBoYXNoaXRlbS4gIElmIHRoZSBpdGVtIHdhcyBub3QgZm91bmQgdGhlbgogICogSEFTSElURU1fRU1QVFkoKSBpcyBUUlVFLiAgVGhlIHBvaW50ZXIgaXMgdGhlbiB0aGUgcGxhY2Ugd2hlcmUgdGhlIGtleQpkaWZmIC0tZ2l0IGEvc3JjL21lbWxpbmUuYyBiL3NyYy9tZW1saW5lLmMKaW5kZXggM2ViYTk4ZC4uOWFiZjE1NSAxMDA2NDQKLS0tIGEvc3JjL21lbWxpbmUuYworKysgYi9zcmMvbWVtbGluZS5jCkBAIC0xMywxMCArMTMsMTEgQEAKIAogLyoKICAqIG1lbWxpbmUuYzogQ29udGFpbnMgdGhlIGZ1bmN0aW9ucyBmb3IgYXBwZW5kaW5nLCBkZWxldGluZyBhbmQgY2hhbmdpbmcgdGhlCi0gKiB0ZXh0IGxpbmVzLiBUaGUgbWVtZmlsZSBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gc3RvcmUgdGhlIGluZm9ybWF0aW9uIGluIGJsb2NrcwotICogb2YgbWVtb3J5LCBiYWNrZWQgdXAgYnkgYSBmaWxlLiBUaGUgc3RydWN0dXJlIG9mIHRoZSBpbmZvcm1hdGlvbiBpcyBhIHRyZWUuCi0gKiBUaGUgcm9vdCBvZiB0aGUgdHJlZSBpcyBhIHBvaW50ZXIgYmxvY2suIFRoZSBsZWF2ZXMgb2YgdGhlIHRyZWUgYXJlIGRhdGEKLSAqIGJsb2Nrcy4gSW4gYmV0d2VlbiBtYXkgYmUgc2V2ZXJhbCBsYXllcnMgb2YgcG9pbnRlciBibG9ja3MsIGZvcm1pbmcgYnJhbmNoZXMuCisgKiB0ZXh0IGxpbmVzLiBUaGUgbWVtZmlsZSBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gc3RvcmUgdGhlIGluZm9ybWF0aW9uIGluCisgKiBibG9ja3Mgb2YgbWVtb3J5LCBiYWNrZWQgdXAgYnkgYSBmaWxlLiBUaGUgc3RydWN0dXJlIG9mIHRoZSBpbmZvcm1hdGlvbiBpcworICogYSB0cmVlLiAgVGhlIHJvb3Qgb2YgdGhlIHRyZWUgaXMgYSBwb2ludGVyIGJsb2NrLiBUaGUgbGVhdmVzIG9mIHRoZSB0cmVlCisgKiBhcmUgZGF0YSBibG9ja3MuIEluIGJldHdlZW4gbWF5IGJlIHNldmVyYWwgbGF5ZXJzIG9mIHBvaW50ZXIgYmxvY2tzLAorICogZm9ybWluZyBicmFuY2hlcy4KICAqCiAgKiBUaHJlZSB0eXBlcyBvZiBibG9ja3MgYXJlIHVzZWQ6CiAgKiAtIEJsb2NrIG5yIDAgY29udGFpbnMgaW5mb3JtYXRpb24gZm9yIHJlY292ZXJ5CkBAIC0xNjksNyArMTcwLDcgQEAKIH07CiAKIC8qCi0gKiBOb3RlOiBiMF9mbmFtZSBhbmQgYjBfZmxhZ3MgYXJlIHB1dCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIG5hbWUuICBGb3IgdmVyeQorICogTm90ZTogYjBfZGlydHkgYW5kIGIwX2ZsYWdzIGFyZSBwdXQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBuYW1lLiAgRm9yIHZlcnkKICAqIGxvbmcgZmlsZSBuYW1lcyBpbiBvbGRlciB2ZXJzaW9ucyBvZiBWaW0gdGhleSBhcmUgaW52YWxpZC4KICAqIFRoZSAnZmlsZWVuY29kaW5nJyBjb21lcyBiZWZvcmUgYjBfZmxhZ3MsIHdpdGggYSBOVUwgaW4gZnJvbnQuICBCdXQgb25seQogICogd2hlbiB0aGVyZSBpcyByb29tLCBmb3IgdmVyeSBsb25nIGZpbGUgbmFtZXMgaXQncyBvbWl0dGVkLgpAQCAtMjQ1LDEyICsyNDYsMTMgQEAKICNlbmRpZgogCiAvKgotICogb3BlbiBhIG5ldyBtZW1saW5lIGZvciAnY3VyYnVmJworICogT3BlbiBhIG5ldyBtZW1saW5lIGZvciAiYnVmIi4KICAqCi0gKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCisgKiBSZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlLgogICovCiAgICAgaW50Ci1tbF9vcGVuKCkKK21sX29wZW4oYnVmKQorICAgIGJ1Zl9UCSpidWY7CiB7CiAgICAgbWVtZmlsZV9UCSptZnA7CiAgICAgYmhkcl9UCSpocCA9IE5VTEw7CkBAIC0yNTgsMzYgKzI2MCwzNiBAQAogICAgIFBUUl9CTAkqcHA7CiAgICAgREFUQV9CTAkqZHA7CiAKLS8qCi0gKiBpbml0IGZpZWxkcyBpbiBtZW1saW5lIHN0cnVjdAotICovCi0gICAgY3VyYnVmLT5iX21sLm1sX3N0YWNrX3NpemUgPSAwOwkvKiBubyBzdGFjayB5ZXQgKi8KLSAgICBjdXJidWYtPmJfbWwubWxfc3RhY2sgPSBOVUxMOwkvKiBubyBzdGFjayB5ZXQgKi8KLSAgICBjdXJidWYtPmJfbWwubWxfc3RhY2tfdG9wID0gMDsJLyogbm90aGluZyBpbiB0aGUgc3RhY2sgKi8KLSAgICBjdXJidWYtPmJfbWwubWxfbG9ja2VkID0gTlVMTDsJLyogbm8gY2FjaGVkIGJsb2NrICovCi0gICAgY3VyYnVmLT5iX21sLm1sX2xpbmVfbG51bSA9IDA7CS8qIG5vIGNhY2hlZCBsaW5lICovCisgICAgLyoKKyAgICAgKiBpbml0IGZpZWxkcyBpbiBtZW1saW5lIHN0cnVjdAorICAgICAqLworICAgIGJ1Zi0+Yl9tbC5tbF9zdGFja19zaXplID0gMDsJLyogbm8gc3RhY2sgeWV0ICovCisgICAgYnVmLT5iX21sLm1sX3N0YWNrID0gTlVMTDsJLyogbm8gc3RhY2sgeWV0ICovCisgICAgYnVmLT5iX21sLm1sX3N0YWNrX3RvcCA9IDA7CS8qIG5vdGhpbmcgaW4gdGhlIHN0YWNrICovCisgICAgYnVmLT5iX21sLm1sX2xvY2tlZCA9IE5VTEw7CS8qIG5vIGNhY2hlZCBibG9jayAqLworICAgIGJ1Zi0+Yl9tbC5tbF9saW5lX2xudW0gPSAwOwkvKiBubyBjYWNoZWQgbGluZSAqLwogI2lmZGVmIEZFQVRfQllURU9GRgotICAgIGN1cmJ1Zi0+Yl9tbC5tbF9jaHVua3NpemUgPSBOVUxMOworICAgIGJ1Zi0+Yl9tbC5tbF9jaHVua3NpemUgPSBOVUxMOwogI2VuZGlmCiAKLS8qCi0gKiBXaGVuICd1cGRhdGVjb3VudCcgaXMgbm9uLXplcm8sIGZsYWcgdGhhdCBhIHN3YXAgZmlsZSBtYXkgYmUgb3BlbmVkIGxhdGVyLgotICovCi0gICAgaWYgKHBfdWMgJiYgY3VyYnVmLT5iX3Bfc3dmKQotCWN1cmJ1Zi0+Yl9tYXlfc3dhcCA9IFRSVUU7CisgICAgLyoKKyAgICAgKiBXaGVuICd1cGRhdGVjb3VudCcgaXMgbm9uLXplcm8gc3dhcCBmaWxlIG1heSBiZSBvcGVuZWQgbGF0ZXIuCisgICAgICovCisgICAgaWYgKHBfdWMgJiYgYnVmLT5iX3Bfc3dmKQorCWJ1Zi0+Yl9tYXlfc3dhcCA9IFRSVUU7CiAgICAgZWxzZQotCWN1cmJ1Zi0+Yl9tYXlfc3dhcCA9IEZBTFNFOworCWJ1Zi0+Yl9tYXlfc3dhcCA9IEZBTFNFOwogCi0vKgotICogT3BlbiB0aGUgbWVtZmlsZS4gIE5vIHN3YXAgZmlsZSBpcyBjcmVhdGVkIHlldC4KLSAqLworICAgIC8qCisgICAgICogT3BlbiB0aGUgbWVtZmlsZS4gIE5vIHN3YXAgZmlsZSBpcyBjcmVhdGVkIHlldC4KKyAgICAgKi8KICAgICBtZnAgPSBtZl9vcGVuKE5VTEwsIDApOwogICAgIGlmIChtZnAgPT0gTlVMTCkKIAlnb3RvIGVycm9yOwogCi0gICAgY3VyYnVmLT5iX21sLm1sX21mcCA9IG1mcDsKLSAgICBjdXJidWYtPmJfbWwubWxfZmxhZ3MgPSBNTF9FTVBUWTsKLSAgICBjdXJidWYtPmJfbWwubWxfbGluZV9jb3VudCA9IDE7CisgICAgYnVmLT5iX21sLm1sX21mcCA9IG1mcDsKKyAgICBidWYtPmJfbWwubWxfZmxhZ3MgPSBNTF9FTVBUWTsKKyAgICBidWYtPmJfbWwubWxfbGluZV9jb3VudCA9IDE7CiAjaWZkZWYgRkVBVF9MSU5FQlJFQUsKICAgICBjdXJ3aW4tPndfbnJ3aWR0aF9saW5lX2NvdW50ID0gMDsKICNlbmRpZgpAQCAtMjk2LDcgKzI5OCw3IEBACiAgICAgLyogZm9yIDE2IGJpdCBNUy1ET1MgY3JlYXRlIGEgc3dhcGZpbGUgbm93LCBiZWNhdXNlIHdlIHJ1biBvdXQgb2YKICAgICAgKiBtZW1vcnkgdmVyeSBxdWlja2x5ICovCiAgICAgaWYgKHBfdWMgIT0gMCkKLQltbF9vcGVuX2ZpbGUoY3VyYnVmKTsKKwltbF9vcGVuX2ZpbGUoYnVmKTsKICNlbmRpZgogCiAvKgpAQCAtMzEzLDM2ICszMTUsNDAgQEAKIAogICAgIGIwcC0+YjBfaWRbMF0gPSBCTE9DSzBfSUQwOwogICAgIGIwcC0+YjBfaWRbMV0gPSBCTE9DSzBfSUQxOwotICAgIGIwcC0+YjBfZGlydHkgPSBjdXJidWYtPmJfY2hhbmdlZCA/IEIwX0RJUlRZIDogMDsKLSAgICBiMHAtPmIwX2ZsYWdzID0gZ2V0X2ZpbGVmb3JtYXQoY3VyYnVmKSArIDE7CiAgICAgYjBwLT5iMF9tYWdpY19sb25nID0gKGxvbmcpQjBfTUFHSUNfTE9ORzsKICAgICBiMHAtPmIwX21hZ2ljX2ludCA9IChpbnQpQjBfTUFHSUNfSU5UOwogICAgIGIwcC0+YjBfbWFnaWNfc2hvcnQgPSAoc2hvcnQpQjBfTUFHSUNfU0hPUlQ7CiAgICAgYjBwLT5iMF9tYWdpY19jaGFyID0gQjBfTUFHSUNfQ0hBUjsKLQogICAgIFNUUk5DUFkoYjBwLT5iMF92ZXJzaW9uLCAiVklNICIsIDQpOwogICAgIFNUUk5DUFkoYjBwLT5iMF92ZXJzaW9uICsgNCwgVmVyc2lvbiwgNik7Ci0gICAgc2V0X2IwX2ZuYW1lKGIwcCwgY3VyYnVmKTsKICAgICBsb25nX3RvX2NoYXIoKGxvbmcpbWZwLT5tZl9wYWdlX3NpemUsIGIwcC0+YjBfcGFnZV9zaXplKTsKLSAgICAodm9pZClnZXRfdXNlcl9uYW1lKGIwcC0+YjBfdW5hbWUsIEIwX1VOQU1FX1NJWkUpOwotICAgIGIwcC0+YjBfdW5hbWVbQjBfVU5BTUVfU0laRSAtIDFdID0gTlVMOwotICAgIG1jaF9nZXRfaG9zdF9uYW1lKGIwcC0+YjBfaG5hbWUsIEIwX0hOQU1FX1NJWkUpOwotICAgIGIwcC0+YjBfaG5hbWVbQjBfSE5BTUVfU0laRSAtIDFdID0gTlVMOwotICAgIGxvbmdfdG9fY2hhcihtY2hfZ2V0X3BpZCgpLCBiMHAtPmIwX3BpZCk7CisKKyAgICBpZiAoIUJfU1BFTEwoYnVmKSkKKyAgICB7CisJYjBwLT5iMF9kaXJ0eSA9IGJ1Zi0+Yl9jaGFuZ2VkID8gQjBfRElSVFkgOiAwOworCWIwcC0+YjBfZmxhZ3MgPSBnZXRfZmlsZWZvcm1hdChidWYpICsgMTsKKwlzZXRfYjBfZm5hbWUoYjBwLCBidWYpOworCSh2b2lkKWdldF91c2VyX25hbWUoYjBwLT5iMF91bmFtZSwgQjBfVU5BTUVfU0laRSk7CisJYjBwLT5iMF91bmFtZVtCMF9VTkFNRV9TSVpFIC0gMV0gPSBOVUw7CisJbWNoX2dldF9ob3N0X25hbWUoYjBwLT5iMF9obmFtZSwgQjBfSE5BTUVfU0laRSk7CisJYjBwLT5iMF9obmFtZVtCMF9ITkFNRV9TSVpFIC0gMV0gPSBOVUw7CisJbG9uZ190b19jaGFyKG1jaF9nZXRfcGlkKCksIGIwcC0+YjBfcGlkKTsKKyAgICB9CiAKICAgICAvKgogICAgICAqIEFsd2F5cyBzeW5jIGJsb2NrIG51bWJlciAwIHRvIGRpc2ssIHNvIHdlIGNhbiBjaGVjayB0aGUgZmlsZSBuYW1lIGluCi0gICAgICogdGhlIHN3YXAgZmlsZSBpbiBmaW5kc3dhcG5hbWUoKS4gRG9uJ3QgZG8gdGhpcyBmb3IgaGVscCBmaWxlcyB0aG91Z2guCisgICAgICogdGhlIHN3YXAgZmlsZSBpbiBmaW5kc3dhcG5hbWUoKS4gRG9uJ3QgZG8gdGhpcyBmb3IgaGVscCBmaWxlcyB0aG91Z2gKKyAgICAgKiBhbmQgc3BlbGwgYnVmZmVyIHRob3VnaC4KICAgICAgKiBPbmx5IHdvcmtzIHdoZW4gdGhlcmUncyBhIHN3YXBmaWxlLCBvdGhlcndpc2UgaXQncyBkb25lIHdoZW4gdGhlIGZpbGUKICAgICAgKiBpcyBjcmVhdGVkLgogICAgICAqLwogICAgIG1mX3B1dChtZnAsIGhwLCBUUlVFLCBGQUxTRSk7Ci0gICAgaWYgKCFjdXJidWYtPmJfaGVscCkKKyAgICBpZiAoIWJ1Zi0+Yl9oZWxwICYmICFCX1NQRUxMKGJ1ZikpCiAJKHZvaWQpbWZfc3luYyhtZnAsIDApOwogCi0vKgotICogZmlsbCBpbiByb290IHBvaW50ZXIgYmxvY2sgYW5kIHdyaXRlIHBhZ2UgMQotICovCisgICAgLyoKKyAgICAgKiBGaWxsIGluIHJvb3QgcG9pbnRlciBibG9jayBhbmQgd3JpdGUgcGFnZSAxLgorICAgICAqLwogICAgIGlmICgoaHAgPSBtbF9uZXdfcHRyKG1mcCkpID09IE5VTEwpCiAJZ290byBlcnJvcjsKICAgICBpZiAoaHAtPmJoX2JudW0gIT0gMSkKQEAgLTM1OCw5ICszNjQsOSBAQAogICAgIHBwLT5wYl9wb2ludGVyWzBdLnBlX2xpbmVfY291bnQgPSAxOyAgICAvKiBsaW5lIGNvdW50IGFmdGVyIGluc2VydGlvbiAqLwogICAgIG1mX3B1dChtZnAsIGhwLCBUUlVFLCBGQUxTRSk7CiAKLS8qCi0gKiBhbGxvY2F0ZSBmaXJzdCBkYXRhIGJsb2NrIGFuZCBjcmVhdGUgYW4gZW1wdHkgbGluZSAxLgotICovCisgICAgLyoKKyAgICAgKiBBbGxvY2F0ZSBmaXJzdCBkYXRhIGJsb2NrIGFuZCBjcmVhdGUgYW4gZW1wdHkgbGluZSAxLgorICAgICAqLwogICAgIGlmICgoaHAgPSBtbF9uZXdfZGF0YShtZnAsIEZBTFNFLCAxKSkgPT0gTlVMTCkKIAlnb3RvIGVycm9yOwogICAgIGlmIChocC0+YmhfYm51bSAhPSAyKQpAQCAtMzg0LDcgKzM5MCw3IEBACiAJICAgIG1mX3B1dChtZnAsIGhwLCBGQUxTRSwgRkFMU0UpOwogCW1mX2Nsb3NlKG1mcCwgVFJVRSk7CSAgICAvKiB3aWxsIGFsc28gZnJlZShtZnAtPm1mX2ZuYW1lKSAqLwogICAgIH0KLSAgICBjdXJidWYtPmJfbWwubWxfbWZwID0gTlVMTDsKKyAgICBidWYtPmJfbWwubWxfbWZwID0gTlVMTDsKICAgICByZXR1cm4gRkFJTDsKIH0KIApAQCAtNTE4LDYgKzUyNCwxOCBAQAogICAgIGlmIChtZnAgPT0gTlVMTCB8fCBtZnAtPm1mX2ZkID49IDAgfHwgIWJ1Zi0+Yl9wX3N3ZikKIAlyZXR1cm47CQkvKiBub3RoaW5nIHRvIGRvICovCiAKKyNpZmRlZiBGRUFUX1NZTl9ITAorICAgIC8qIEZvciBhIHNwZWxsIGJ1ZmZlciB1c2UgYSB0ZW1wIGZpbGUgbmFtZS4gKi8KKyAgICBpZiAoYnVmLT5iX3NwZWxsKQorICAgIHsKKwlmbmFtZSA9IHZpbV90ZW1wbmFtZSgncycpOworCWlmIChmbmFtZSAhPSBOVUxMKQorCSAgICAodm9pZCltZl9vcGVuX2ZpbGUobWZwLCBmbmFtZSk7CS8qIGNvbnN1bWVzIGZuYW1lISAqLworCWJ1Zi0+Yl9tYXlfc3dhcCA9IEZBTFNFOworCXJldHVybjsKKyAgICB9CisjZW5kaWYKKwogICAgIC8qCiAgICAgICogVHJ5IGFsbCBkaXJlY3RvcmllcyBpbiAnZGlyZWN0b3J5JyBvcHRpb24uCiAgICAgICovCkBAIC04ODYsNyArOTA0LDcgQEAKIAlnb3RvIHRoZWVuZDsJCQkvKiBvdXQgb2YgbWVtb3J5ICovCiAKICAgICAvKiBXaGVuIGNhbGxlZCBmcm9tIG1haW4oKSBzdGlsbCBuZWVkIHRvIGluaXRpYWxpemUgc3RvcmFnZSBzdHJ1Y3R1cmUgKi8KLSAgICBpZiAoY2FsbGVkX2Zyb21fbWFpbiAmJiBtbF9vcGVuKCkgPT0gRkFJTCkKKyAgICBpZiAoY2FsbGVkX2Zyb21fbWFpbiAmJiBtbF9vcGVuKGN1cmJ1ZikgPT0gRkFJTCkKIAlnZXRvdXQoMSk7CiAKIC8qCkBAIC0yMTAwLDYgKzIxMTgsMjggQEAKICAgICByZXR1cm4gbWxfYXBwZW5kX2ludChjdXJidWYsIGxudW0sIGxpbmUsIGxlbiwgbmV3ZmlsZSwgRkFMU0UpOwogfQogCisjaWYgZGVmaW5lZChGRUFUX1NZTl9ITCkgfHwgZGVmaW5lZChQUk9UTykKKy8qCisgKiBMaWtlIG1sX2FwcGVuZCgpIGJ1dCBmb3IgYW4gYXJiaXRyYXJ5IGJ1ZmZlci4gIFRoZSBidWZmZXIgbXVzdCBhbHJlYWR5IGhhdmUKKyAqIGEgbWVtbGluZS4KKyAqLworICAgIGludAorbWxfYXBwZW5kX2J1ZihidWYsIGxudW0sIGxpbmUsIGxlbiwgbmV3ZmlsZSkKKyAgICBidWZfVAkqYnVmOworICAgIGxpbmVucl9UCWxudW07CQkvKiBhcHBlbmQgYWZ0ZXIgdGhpcyBsaW5lIChjYW4gYmUgMCkgKi8KKyAgICBjaGFyX3UJKmxpbmU7CQkvKiB0ZXh0IG9mIHRoZSBuZXcgbGluZSAqLworICAgIGNvbG5yX1QJbGVuOwkJLyogbGVuZ3RoIG9mIG5ldyBsaW5lLCBpbmNsdWRpbmcgTlVMLCBvciAwICovCisgICAgaW50CQluZXdmaWxlOwkvKiBmbGFnLCBzZWUgYWJvdmUgKi8KK3sKKyAgICBpZiAoYnVmLT5iX21sLm1sX21mcCA9PSBOVUxMKQorCXJldHVybiBGQUlMOworCisgICAgaWYgKGJ1Zi0+Yl9tbC5tbF9saW5lX2xudW0gIT0gMCkKKwltbF9mbHVzaF9saW5lKGJ1Zik7CisgICAgcmV0dXJuIG1sX2FwcGVuZF9pbnQoYnVmLCBsbnVtLCBsaW5lLCBsZW4sIG5ld2ZpbGUsIEZBTFNFKTsKK30KKyNlbmRpZgorCiAgICAgc3RhdGljIGludAogbWxfYXBwZW5kX2ludChidWYsIGxudW0sIGxpbmUsIGxlbiwgbmV3ZmlsZSwgbWFyaykKICAgICBidWZfVAkqYnVmOwpAQCAtMjU5OSw3ICsyNjM5LDcgQEAKIH0KIAogLyoKLSAqIHJlcGxhY2UgbGluZSBsbnVtLCB3aXRoIGJ1ZmZlcmluZywgaW4gY3VycmVudCBidWZmZXIKKyAqIFJlcGxhY2UgbGluZSBsbnVtLCB3aXRoIGJ1ZmZlcmluZywgaW4gY3VycmVudCBidWZmZXIuCiAgKgogICogSWYgY29weSBpcyBUUlVFLCBtYWtlIGEgY29weSBvZiB0aGUgbGluZSwgb3RoZXJ3aXNlIHRoZSBsaW5lIGhhcyBiZWVuCiAgKiBjb3BpZWQgdG8gYWxsb2NhdGVkIG1lbW9yeSBhbHJlYWR5LgpAQCAtMjY0Myw3ICsyNjgzLDcgQEAKIH0KIAogLyoKLSAqIGRlbGV0ZSBsaW5lICdsbnVtJworICogRGVsZXRlIGxpbmUgJ2xudW0nIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4KICAqCiAgKiBDaGVjazogVGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBwcm9iYWJseSBhbHNvIGNhbGwKICAqIGRlbGV0ZWRfbGluZXMoKSBhZnRlciB0aGlzLgpAQCAtNDExNCw3ICs0MTU0LDkgQEAKICNlbmRpZgogCQkgICAgewogCQkJTVNHX1BVVFMoIlxuIik7Ci0JCQluZWVkX3dhaXRfcmV0dXJuID0gVFJVRTsgLyogY2FsbCB3YWl0X3JldHVybiBsYXRlciAqLworCQkJaWYgKG1zZ19zaWxlbnQgPT0gMCkKKwkJCSAgICAvKiBjYWxsIHdhaXRfcmV0dXJuKCkgbGF0ZXIgKi8KKwkJCSAgICBuZWVkX3dhaXRfcmV0dXJuID0gVFJVRTsKIAkJICAgIH0KIAogI2lmZGVmIENSRUFURV9EVU1NWV9GSUxFCmRpZmYgLS1naXQgYS9zcmMvbWVzc2FnZS5jIGIvc3JjL21lc3NhZ2UuYwppbmRleCA4ZWE0OWFlLi40NjViMjVlIDEwMDY0NAotLS0gYS9zcmMvbWVzc2FnZS5jCisrKyBiL3NyYy9tZXNzYWdlLmMKQEAgLTc1Miw3ICs3NTIsNyBAQAogCXJldHVybjsKIAogICAgIC8qIERvbid0IGxldCB0aGUgbWVzc2FnZSBoaXN0b3J5IGdldCB0b28gYmlnICovCi0gICAgd2hpbGUgKG1zZ19oaXN0X2xlbiA+IDIwKQorICAgIHdoaWxlIChtc2dfaGlzdF9sZW4gPiBNQVhfTVNHX0hJU1RfTEVOKQogCSh2b2lkKWRlbGV0ZV9maXJzdF9tc2coKTsKIAogICAgIC8qIGFsbG9jYXRlIGFuIGVudHJ5IGFuZCBhZGQgdGhlIG1lc3NhZ2UgYXQgdGhlIGVuZCBvZiB0aGUgaGlzdG9yeSAqLwpkaWZmIC0tZ2l0IGEvc3JjL21pc2MxLmMgYi9zcmMvbWlzYzEuYwppbmRleCBhNWExODA1Li4wOGNkMjBjIDEwMDY0NAotLS0gYS9zcmMvbWlzYzEuYworKysgYi9zcmMvbWlzYzEuYwpAQCAtNzk1Miw2ICs3OTUyLDEwIEBACiAKICAgICBwcmVwYXJlX3RvX2V4aXQoKTsKIAorICAgIC8qIFNldHRpbmcgdGhpcyB3aWxsIHByZXZlbnQgZnJlZSgpIGNhbGxzLiAgVGhhdCBhdm9pZHMgY2FsbGluZyBmcmVlKCkKKyAgICAgKiByZWN1cnNpdmVseSB3aGVuIGZyZWUoKSB3YXMgaW52b2tlZCB3aXRoIGEgYmFkIHBvaW50ZXIuICovCisgICAgcmVhbGx5X2V4aXRpbmcgPSBUUlVFOworCiAgICAgb3V0X3N0cihJT2J1ZmYpOwogICAgIHNjcmVlbl9zdGFydCgpOwkJICAgIC8qIGRvbid0IGtub3cgd2hlcmUgY3Vyc29yIGlzIG5vdyAqLwogICAgIG91dF9mbHVzaCgpOwpkaWZmIC0tZ2l0IGEvc3JjL21pc2MyLmMgYi9zcmMvbWlzYzIuYwppbmRleCBjM2YyYjM3Li5mNWIxM2U3IDEwMDY0NAotLS0gYS9zcmMvbWlzYzIuYworKysgYi9zcmMvbWlzYzIuYwpAQCAtMTQyNiwxMyArMTQyNiwxNSBAQAogfQogCiAvKgotICogcmVwbGFjZW1lbnQgZm9yIGZyZWUoKSB0aGF0IGlnbm9yZXMgTlVMTCBwb2ludGVycworICogUmVwbGFjZW1lbnQgZm9yIGZyZWUoKSB0aGF0IGlnbm9yZXMgTlVMTCBwb2ludGVycy4KKyAqIEFsc28gc2tpcCBmcmVlKCkgd2hlbiBleGl0aW5nIGZvciBzdXJlLCB0aGlzIGhlbHBzIHdoZW4gd2UgY2F1Z2h0IGEgZGVhZGx5CisgKiBzaWduYWwgdGhhdCB3YXMgY2F1c2VkIGJ5IGEgY3Jhc2ggaW4gZnJlZSgpLgogICovCiAgICAgdm9pZAogdmltX2ZyZWUoeCkKICAgICB2b2lkICp4OwogewotICAgIGlmICh4ICE9IE5VTEwpCisgICAgaWYgKHggIT0gTlVMTCAmJiAhcmVhbGx5X2V4aXRpbmcpCiAgICAgewogI2lmZGVmIE1FTV9QUk9GSUxFCiAJbWVtX3ByZV9mcmVlKCZ4KTsKZGlmZiAtLWdpdCBhL3NyYy9wby9pdC5wbyBiL3NyYy9wby9pdC5wbwppbmRleCBlZDI1ZjQ3Li5kYmE1NDZjIDEwMDY0NAotLS0gYS9zcmMvcG8vaXQucG8KKysrIGIvc3JjL3BvL2l0LnBvCkBAIC0xMiw5ICsxMiw4IEBACiBtc2dpZCAiIgogbXNnc3RyICIiCiAiUHJvamVjdC1JZC1WZXJzaW9uOiB2aW0gNy4wXG4iCi0iUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IFxuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDA1LTA4LTI1IDA5OjMwKzAyMDBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiAgMjAwNS0wOC0yOSAyMTozMCswMjAwXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMDYtMDEtMDMgMTY6MDcrMDEwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6ICAyMDA2LTAxLTA2IDEzOjUwKzAxMDBcbiIKICJMYXN0LVRyYW5zbGF0b3I6ICAgVmxhZCBTYW5kcmluaSAgIDxtYXJjb0BzYW5kcmluaS5iaXo+XG4iCiAiTGFuZ3VhZ2UtVGVhbTogICAgIEl0YWxpYW4iCiAiICAgICAgICAgICAgICAgICAgIEFudG9uaW8gQ29sb21ibyA8YXpjMTBAeWFob28uY29tPiIKQEAgLTIyLDYgKzIxLDcgQEAKICJNSU1FLVZlcnNpb246IDEuMFxuIgogIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1JU09fODg1OS0xXG4iCiAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOC1iaXRcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogXG4iCiAKIG1zZ2lkICJFODI6IENhbm5vdCBhbGxvY2F0ZSBhbnkgYnVmZmVyLCBleGl0aW5nLi4uIgogbXNnc3RyICJFODI6IE5vbiByaWVzY28gYWQgYWxsb2NhcmUgYWxjdW4gYnVmZmVyLCBlc2NvLi4uIgpAQCAtMjU0LDggKzI1NCw4IEBACiBtc2dpZCAiIFVzZXIgZGVmaW5lZCBjb21wbGV0aW9uICheVV5OXlApIgogbXNnc3RyICIgQ29tcGxldGFtZW50byBkZWZpbml0byBkYWxsJ3V0ZW50ZSAoXlVeTl5QKSIKIAotbXNnaWQgIiBPY2N1bHQgY29tcGxldGlvbiAoXk9eTl5QKSIKLW1zZ3N0ciAiIENvbXBsZXRhbWVudG8gbmFzY29zdG8gKF5PXk5eUCkiCittc2dpZCAiIE9tbmkgY29tcGxldGlvbiAoXk9eTl5QKSIKK21zZ3N0ciAiIENvbXBsZXRhbWVudG8gZ2xvYmFsZSAoXk9eTl5QKSIKIAogbXNnaWQgIiBTcGVsbGluZyBzdWdnZXN0aW9uICheU15OXlApIgogbXNnc3RyICIgU3VnZ2VyaW1lbnRvIG9ydG9ncmFmaWNvICheU15OXlApIgpAQCAtMjY3LDEwICsyNjcsMTAgQEAKIG1zZ3N0ciAiR2l1bnRvIGFsbGEgZmluZSBkZWwgcGFyYWdyYWZvIgogCiBtc2dpZCAiJ2RpY3Rpb25hcnknIG9wdGlvbiBpcyBlbXB0eSIKLW1zZ3N0ciAibCdvcHppb25lICdkaWN0aW9uYXJ5JyDoIHZ1b3RhIgorbXNnc3RyICJsJ29wemlvbmUgJ2RpY3Rpb25hcnknIG5vbiDoIGltcG9zdGF0YSIKIAogbXNnaWQgIid0aGVzYXVydXMnIG9wdGlvbiBpcyBlbXB0eSIKLW1zZ3N0ciAibCdvcHppb25lICd0aGVzYXVydXMnIOggdnVvdGEiCittc2dzdHIgImwnb3B6aW9uZSAndGhlc2F1cnVzJyBub24g6CBpbXBvc3RhdGEiCiAKICMsIGMtZm9ybWF0CiBtc2dpZCAiU2Nhbm5pbmcgZGljdGlvbmFyeTogJXMiCkBAIC0xMTMxLDIxICsxMTMxLDggQEAKIG1zZ2lkICJFMTc4OiBJbnZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIGNvdW50IgogbXNnc3RyICJFMTc4OiBWYWxvcmUgcHJlZGVmaW5pdG8gZGVsIGNvbnRhdG9yZSBub24gdmFsaWRvIgogCi1tc2dpZCAiRTE3OTogYXJndW1lbnQgcmVxdWlyZWQgZm9yIGNvbXBsZXRlIgotbXNnc3RyICJFMTc5OiBhcmdvbWVudG8gbmVjZXNzYXJpbyBwZXIgY29tcGxldGUiCi0KLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRTE4MDogSW52YWxpZCBjb21wbGV0ZSB2YWx1ZTogJXMiCi1tc2dzdHIgIkUxODA6IFZhbG9yZSAlcyBub24gdmFsaWRvIHBlciAnY29tcGxldGUnIgotCi1tc2dpZCAiRTQ2ODogQ29tcGxldGlvbiBhcmd1bWVudCBvbmx5IGFsbG93ZWQgZm9yIGN1c3RvbSBjb21wbGV0aW9uIgotbXNnc3RyICIiCi0iRTQ2ODogQXJnb21lbnRvIGRpIGNvbXBsZXRhbWVudG8gcGVybWVzc28gc29sbyBwZXIgY29tcGxldGFtZW50byAiCi0icGVyc29uYWxpenphdG8iCi0KLW1zZ2lkICJFNDY3OiBDdXN0b20gY29tcGxldGlvbiByZXF1aXJlcyBhIGZ1bmN0aW9uIGFyZ3VtZW50IgotbXNnc3RyICIiCi0iRTQ2NzogSWwgY29tcGxldGFtZW50byBwZXJzb25hbGl6emF0byByaWNoaWVkZSB1biBhcmdvbWVudG8gZGkgZnVuemlvbmUiCittc2dpZCAiRTE3OTogYXJndW1lbnQgcmVxdWlyZWQgZm9yIC1jb21wbGV0ZSIKK21zZ3N0ciAiRTE3OTogYXJnb21lbnRvIG5lY2Vzc2FyaW8gcGVyIC1jb21wbGV0ZSIKIAogIywgYy1mb3JtYXQKIG1zZ2lkICJFMTgxOiBJbnZhbGlkIGF0dHJpYnV0ZTogJXMiCkBAIC0xMTYzLDYgKzExNTAsMTkgQEAKIG1zZ3N0ciAiRTE4NDogQ29tYW5kbyBkZWZpbml0byBkYWxsJ3V0ZW50ZSAlcyBpbmVzaXN0ZW50ZSIKIAogIywgYy1mb3JtYXQKK21zZ2lkICJFMTgwOiBJbnZhbGlkIGNvbXBsZXRlIHZhbHVlOiAlcyIKK21zZ3N0ciAiRTE4MDogVmFsb3JlICVzIG5vbiB2YWxpZG8gcGVyICdjb21wbGV0ZSciCisKK21zZ2lkICJFNDY4OiBDb21wbGV0aW9uIGFyZ3VtZW50IG9ubHkgYWxsb3dlZCBmb3IgY3VzdG9tIGNvbXBsZXRpb24iCittc2dzdHIgIiIKKyJFNDY4OiBBcmdvbWVudG8gZGkgY29tcGxldGFtZW50byBwZXJtZXNzbyBzb2xvIHBlciBjb21wbGV0YW1lbnRvICIKKyJwZXJzb25hbGl6emF0byIKKworbXNnaWQgIkU0Njc6IEN1c3RvbSBjb21wbGV0aW9uIHJlcXVpcmVzIGEgZnVuY3Rpb24gYXJndW1lbnQiCittc2dzdHIgIiIKKyJFNDY3OiBJbCBjb21wbGV0YW1lbnRvIHBlcnNvbmFsaXp6YXRvIHJpY2hpZWRlIHVuIGFyZ29tZW50byBkaSBmdW56aW9uZSIKKworIywgYy1mb3JtYXQKIG1zZ2lkICJFMTg1OiBDYW5ub3QgZmluZCBjb2xvciBzY2hlbWUgJXMiCiBtc2dzdHIgIkUxODU6IE5vbiByaWVzY28gYSB0cm92YXJlIHNjaGVtYSBjb2xvcmUgJXMiCiAKQEAgLTE0MjAsNiArMTQyMCwxMiBAQAogbXNnaWQgIltOZXcgRmlsZV0iCiBtc2dzdHIgIltGaWxlIG51b3ZvXSIKIAorbXNnaWQgIltOZXcgRElSRUNUT1JZXSIKK21zZ3N0ciAiW051b3ZhIERJUkVDVE9SWV0iCisKK21zZ2lkICJbRmlsZSB0b28gYmlnXSIKK21zZ3N0ciAiW0ZpbGUgdHJvcHBvIGdyYW5kZV0iCisKIG1zZ2lkICJbUGVybWlzc2lvbiBEZW5pZWRdIgogbXNnc3RyICJbVGlwbyBkaSBhY2Nlc3NvIG5vbiBjb25zZW50aXRvXSIKIApAQCAtMTQ2OSw4ICsxNDc1LDkgQEAKIG1zZ2lkICJbY3J5cHRlZF0iCiBtc2dzdHIgIltjaWZyYXRvXSIKIAotbXNnaWQgIltDT05WRVJTSU9OIEVSUk9SXSIKLW1zZ3N0ciAiW0VSUk9SRSBESSBDT05WRVJTSU9ORV0iCisjLCBjLWZvcm1hdAorbXNnaWQgIltDT05WRVJTSU9OIEVSUk9SIGluIGxpbmUgJWxkXSIKK21zZ3N0ciAiW0VSUk9SRSBESSBDT05WRVJTSU9ORSBhbGxhIGxpbmVhICVsZF0iCiAKICMsIGMtZm9ybWF0CiBtc2dpZCAiW0lMTEVHQUwgQllURSBpbiBsaW5lICVsZF0iCkBAIC0zMDI0LDI1ICszMDMxLDYgQEAKIG1zZ2lkICItLXNvY2tldGlkIDx4aWQ+XHRPcGVuIFZpbSBpbnNpZGUgYW5vdGhlciBHVEsgd2lkZ2V0IgogbXNnc3RyICItLXNvY2tldGlkIDx4aWQ+XHRBcHJpIFZpbSBkZW50cm8gdW4gYWx0cm8gJ3dpZGdldCcgR1RLIgogCi1tc2dpZCAiIgotIlxuIgotIkFyZ3VtZW50cyByZWNvZ25pc2VkIGJ5IGt2aW0gKEtERSB2ZXJzaW9uKTpcbiIKLW1zZ3N0ciAiIgotIlxuIgotIkFyZ29tZW50aSBhY2NldHRhdGkgZGEga3ZpbSAodmVyc2lvbmUgS0RFKTpcbiIKLQotbXNnaWQgIi1ibGFja1x0XHRVc2UgcmV2ZXJzZSB2aWRlbyIKLW1zZ3N0ciAiLWJsYWNrXHRcdFVzYSBjb2xvcmkgaW52ZXJ0aXRpIgotCi1tc2dpZCAiLXRpcFx0XHRcdERpc3BsYXkgdGhlIHRpcCBkaWFsb2cgb24gc3RhcnR1cCIKLW1zZ3N0ciAiLXRpcFx0XHRcdE1vc3RyYSBsYSBmaW5lc3RyYSBjb25zaWdsaSBhbGwnYXZ2aW8iCi0KLW1zZ2lkICItbm90aXBcdFx0RGlzYWJsZSB0aGUgdGlwIGRpYWxvZyIKLW1zZ3N0ciAiLW5vdGlwXHRcdERpc2FiaWxpdGEgbGEgZmluZXN0cmEgY29uc2lnbGkiCi0KLW1zZ2lkICItLWRpc3BsYXkgPGRpc3BsYXk+XHRSdW4gdmltIG9uIDxkaXNwbGF5PiIKLW1zZ3N0ciAiLS1kaXNwbGF5IDxzY2hlcm1vPlx0RXNlZ3VpIHZpbSBzdSA8c2NoZXJtbz4iCi0KIG1zZ2lkICItUCA8cGFyZW50IHRpdGxlPlx0T3BlbiBWaW0gaW5zaWRlIHBhcmVudCBhcHBsaWNhdGlvbiIKIG1zZ3N0ciAiLVAgPHRpdG9sbyBwYWRyZT5cdEFwcmkgVmltIGluIHVuJ2FwcGxpY2F6aW9uZSBwYWRyZSIKIApAQCAtMzQ2OCw2ICszNDU2LDEwIEBACiBtc2dpZCAiRTMxNzogcG9pbnRlciBibG9jayBpZCB3cm9uZyAyIgogbXNnc3RyICJFMzE3OiBJRCBibG9jY28gcHVudGF0b3JpIGVycmF0byAyIgogCisjLCBjLWZvcm1hdAorbXNnaWQgIkU3NzM6IFN5bWxpbmsgbG9vcCBmb3IgXCIlc1wiIgorbXNnc3RyICJFNzczOiBDb2xsZWdhbWVudG8gcmljb3JzaXZvIHBlciBcIiVzXCIiCisKIG1zZ2lkICJFMzI1OiBBVFRFTlRJT04iCiBtc2dzdHIgIkUzMjU6IEFUVEVOWklPTkUiCiAKQEAgLTM2NDEsNiArMzYzMywxMCBAQAogbXNnaWQgIlByZXNzIEVOVEVSIG9yIHR5cGUgY29tbWFuZCB0byBjb250aW51ZSIKIG1zZ3N0ciAiUHJlbWkgSU5WSU8gbyB1biBjb21hbmRvIHBlciBwcm9zZWd1aXJlIgogCisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIGxpbmUgJWxkIgorbXNnc3RyICIlcyBsaW5lYSAlbGQiCisKIG1zZ2lkICItLSBNb3JlIC0tIgogbXNnc3RyICItLSBBbmNvcmEgLS0iCiAKQEAgLTM4MzAsNiArMzgyNiwxMiBAQAogbXNnaWQgIkU1MDU6ICIKIG1zZ3N0ciAiRTUwNTogIgogCittc2dpZCAiRTc3NDogJ29wZXJhdG9yZnVuYycgaXMgZW1wdHkiCittc2dzdHIgIkU3NzQ6IG9wemlvbmUgJ29wZXJhdG9yZnVuYycgbm9uIGltcG9zdGF0YSIKKworbXNnaWQgIkU3NzU6IEV2YWwgZmVhdHVyZSBub3QgYXZhaWxhYmxlIgorbXNnc3RyICJFNzc1OiBUaXBvIGRpIHZhbG9yaXp6YXppb25lIFtldmFsXSBub24gZGlzcG9uaWJpbGUiCisKIG1zZ2lkICJXYXJuaW5nOiB0ZXJtaW5hbCBjYW5ub3QgaGlnaGxpZ2h0IgogbXNnc3RyICJBdHRlbnppb25lOiBpbCB0ZXJtaW5hbGUgbm9uIOggaW4gZ3JhZG8gZGkgZXZpZGVuemlhcmUiCiAKQEAgLTM4NDMsNyArMzg0NSw3IEBACiBtc2dzdHIgIkUzNTI6IE5vbiBwb3NzbyB0b2dsaWVyZSBwaWVnYXR1cmUgY29uIGlsICdmb2xkbWV0aG9kJyBpbiB1c28iCiAKIG1zZ2lkICJFNjY0OiBjaGFuZ2VsaXN0IGlzIGVtcHR5IgotbXNnc3RyICJFNjY0OiBsaXN0YSBtb2RpZmljaGUgdnVvdGEiCittc2dzdHIgIkU2NjQ6IGxpc3RhIG1vZGlmaWNoZSBub24gaW1wb3N0YXRhIgogCiBtc2dpZCAiRTY2MjogQXQgc3RhcnQgb2YgY2hhbmdlbGlzdCIKIG1zZ3N0ciAiRTY2MjogQWxsJ2luaXppbyBkZWxsYSBsaXN0YSBtb2RpZmljaGUiCkBAIC00MjI1LDE0ICs0MjI3LDYgQEAKIG1zZ2lkICJPcGVuaW5nIHRoZSBYIGRpc3BsYXkgdG9vayAlbGQgbXNlYyIKIG1zZ3N0ciAiQXR0aXZhemlvbmUgdmlzdWFsaXp6YXppb25lIFggaGEgcmljaGllc3RvICVsZCBtc2VjIgogCi0jLiBLREUgc29tZXRpbWVzIHByb2R1Y2VzIFggZXJyb3IgdGhhdCB3ZSB3YW50IHRvIGlnbm9yZQotbXNnaWQgIiIKLSJcbiIKLSJWaW06IEdvdCBYIGVycm9yIGJ1dCB3ZSBjb250aW51ZS4uLlxuIgotbXNnc3RyICIiCi0iXG4iCi0iVmltOiBQcmVzbyBlcnJvcmUgWCBtYSBhbmRpYW1vIGF2YW50aS4uLlxuIgotCiBtc2dpZCAiIgogIlxuIgogIlZpbTogR290IFggZXJyb3JcbiIKQEAgLTQ1NjIsMTIgKzQ1NTYsNiBAQAogbXNnaWQgInJlY29yZGluZyIKIG1zZ3N0ciAicmVnaXN0cmF6aW9uZSIKIAotbXNnaWQgInNlYXJjaCBoaXQgVE9QLCBjb250aW51aW5nIGF0IEJPVFRPTSIKLW1zZ3N0ciAicmFnZ2l1bnRhIGxhIENJTUEgbmVsbGEgcmljZXJjYSwgY29udGludW8gZGFsIEZPTkRPIgotCi1tc2dpZCAic2VhcmNoIGhpdCBCT1RUT00sIGNvbnRpbnVpbmcgYXQgVE9QIgotbXNnc3RyICJyYWdnaXVudG8gaWwgRk9ORE8gbmVsbGEgcmljZXJjYSwgY29udGludW8gZGFsbGEgQ0lNQSIKLQogIywgYy1mb3JtYXQKIG1zZ2lkICJFMzgzOiBJbnZhbGlkIHNlYXJjaCBzdHJpbmc6ICVzIgogbXNnc3RyICJFMzgzOiBTdHJpbmdhIGRpIHJpY2VyY2Egbm9uIHZhbGlkYTogJXMiCkBAIC00NjQ1LDcgKzQ2MzMsNyBAQAogbXNnc3RyICJDb21wcmltbyBhbGJlcm8gZGkgcGFyb2xlLi4uIgogCiBtc2dpZCAiRTc1NjogU3BlbGwgY2hlY2tpbmcgaXMgbm90IGVuYWJsZWQiCi1tc2dzdHIgIkU3NTY6IElsIGNvbnRyb2xsbyBvcnRvZ3JhZmljbyBub24g6CBhYmlsaXRhdG8iCittc2dzdHIgIkU3NTY6IENvbnRyb2xsbyBvcnRvZ3JhZmljbyBub24gYWJpbGl0YXRvIgogCiAjLCBjLWZvcm1hdAogbXNnaWQgIldhcm5pbmc6IENhbm5vdCBmaW5kIHdvcmQgbGlzdCBcIiVzLiVzLnNwbFwiIG9yIFwiJXMuYXNjaWkuc3BsXCIiCkBAIC00NjU5LDcgKzQ2NDcsNyBAQAogbXNnc3RyICJFNzU3OiBRdWVzdG8gbm9uIHNlbWJyYSB1biBmaWxlIG9ydG9ncmFmaWNvIgogCiBtc2dpZCAiRTc3MTogT2xkIHNwZWxsIGZpbGUsIG5lZWRzIHRvIGJlIHVwZGF0ZWQiCi1tc2dzdHIgIkU3NzE6IEZpbGUgb3J0b2dyYWZpY28gb2Jzb2xldG8sIG5lY2Vzc2FyaW8gYWdnaW9ybmFtZW50byIKK21zZ3N0ciAiRTc3MTogRmlsZSBvcnRvZ3JhZmljbyBvYnNvbGV0bywg6CBuZWNlc3NhcmlvIGFnZ2lvcm5hcmxvIgogCiBtc2dpZCAiRTc3MjogU3BlbGwgZmlsZSBpcyBmb3IgbmV3ZXIgdmVyc2lvbiBvZiBWaW0iCiBtc2dzdHIgIkU3NzI6IElsIGZpbGUgb3J0b2dyYWZpY28g6CBwZXIgdmVyc2lvbmkgZGkgVmltIHBp+SByZWNlbnRpIgpAQCAtNDcxMiwxNCArNDcwMCwyNiBAQAogbXNnc3RyICJWYWxvcmUgZXJyYXRvIHBlciBDT01QT1VORFNZTE1BWCBpbiAlcyBsaW5lYSAlZDogJXMiCiAKICMsIGMtZm9ybWF0Ci1tc2dpZCAiRXhwZWN0ZWQgWSBvciBOIGluICVzIGxpbmUgJWQ6ICVzIgotbXNnc3RyICJZIG8gTiBkZXZlIGVzc2VyZSBwcmVzZW50ZSBpbiAlcyBsaW5lYSAlZDogJXMiCittc2dpZCAiRGlmZmVyZW50IGNvbWJpbmluZyBmbGFnIGluIGNvbnRpbnVlZCBhZmZpeCBibG9jayBpbiAlcyBsaW5lICVkOiAlcyIKK21zZ3N0ciAiIgorIkZsYWcgY29tYmluYXppb25lIGRpdmVyc28gaW4gYmxvY2NvIGFmZmlzc2kgY29udGludW8gaW4gJXMgbGluZWEgJWQ6ICVzIgogCiAjLCBjLWZvcm1hdAogbXNnaWQgIkR1cGxpY2F0ZSBhZmZpeCBpbiAlcyBsaW5lICVkOiAlcyIKIG1zZ3N0ciAiQWZmaXNzbyBkdXBsaWNhdG8gaW4gJXMgbGluZWEgJWQ6ICVzIgogCiAjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJBZmZpeCBhbHNvIHVzZWQgZm9yIEJBRC9SQVJFL0tFRVBDQVNFL05FRURBRkZJWC9ORUVEQ09NUE9VTkQgaW4gJXMgbGluZSAlZDogJSIKKyJzIgorbXNnc3RyICIiCisiQWZmaXNzbyB1c2F0byBhbmNoZSBwZXIgQkFEL1JBUkUvS0VFUENBU0UvTkVFREFGRklYL05FRURDT01QT1VORCBpbiAlcyBsaW5lYSAlZDogJXMiCisKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXhwZWN0ZWQgWSBvciBOIGluICVzIGxpbmUgJWQ6ICVzIgorbXNnc3RyICJZIG8gTiBkZXZlIGVzc2VyZSBwcmVzZW50ZSBpbiAlcyBsaW5lYSAlZDogJXMiCisKKyMsIGMtZm9ybWF0CiBtc2dpZCAiQnJva2VuIGNvbmRpdGlvbiBpbiAlcyBsaW5lICVkOiAlcyIKIG1zZ3N0ciAiQ29uZGl6aW9uZSBub24gcmlzcGV0dGF0YSBpbiAlcyBsaW5lYSAlZDogJXMiCiAKQEAgLTQ3NDcsMTMgKzQ3NDcsMTMgQEAKIG1zZ3N0ciAiQ09NUE9VTkRTWUxNQVggdXNhdG8gc2VuemEgU1lMTEFCTEUiCiAKIG1zZ2lkICJUb28gbWFueSBwb3N0cG9uZWQgcHJlZml4ZXMiCi1tc2dzdHIgIlRyb3BwaSBwcmVmaXNzaSBwb3Nwb3N0aSIKK21zZ3N0ciAiVHJvcHBpIHN1ZmZpc3NpIgogCiBtc2dpZCAiVG9vIG1hbnkgY29tcG91bmQgZmxhZ3MiCiBtc2dzdHIgIlRyb3BwaSBmbGFnIGNvbXBvc3RpIgogCiBtc2dpZCAiVG9vIG1hbnkgcG9zcG9uZWQgcHJlZml4ZXMgYW5kL29yIGNvbXBvdW5kIGZsYWdzIgotbXNnc3RyICJUcm9wcGkgcHJlZmlzc2kgcG9zcG9zdGkgZS9vIGZsYWcgY29tcG9zdGkiCittc2dzdHIgIlRyb3BwaSBzdWZmaXNzaSBlL28gZmxhZyBjb21wb3N0aSIKIAogIywgYy1mb3JtYXQKIG1zZ2lkICJNaXNzaW5nIFNPRk8lcyBsaW5lIGluICVzIgpAQCAtNDg2NywxMSArNDg2Nyw4IEBACiBtc2dpZCAiRXN0aW1hdGVkIHJ1bnRpbWUgbWVtb3J5IHVzZTogJWQgYnl0ZXMiCiBtc2dzdHIgIlVzbyBzdGltYXRvIGRpIG1lbW9yaWEgZHVyYW50ZSBlc2VjdXppb25lOiAlZCBieXRlcyIKIAotbXNnaWQgIkU3NjQ6ICdzcGVsbGZpbGUnIGlzIG5vdCBzZXQiCi1tc2dzdHIgIkU3NjQ6IG9wemlvbmUgJ3NwZWxsZmlsZScgdnVvdGEiCi0KICMsIGMtZm9ybWF0Ci1tc2dpZCAiRTc2NTogJ3NwZWxsZmlsZScgZG9lcyBub3QgaGF2ZSAlbGQgZW50aWVzIgorbXNnaWQgIkU3NjU6ICdzcGVsbGZpbGUnIGRvZXMgbm90IGhhdmUgJWxkIGVudHJpZXMiCiBtc2dzdHIgIkU3NjU6ICdzcGVsbGZpbGUnIG5vbiBoYSAlbGQgZWxlbWVudGkiCiAKIG1zZ2lkICJFNzYzOiBXb3JkIGNoYXJhY3RlcnMgZGlmZmVyIGJldHdlZW4gc3BlbGwgZmlsZXMiCkBAIC01NDA2LDkgKzU0MDMsNiBAQAogbXNnaWQgIndpdGggKGNsYXNzaWMpIEdVSS4iCiBtc2dzdHIgImNvbiBHVUkgKGNsYXNzaWNhKS4iCiAKLW1zZ2lkICJ3aXRoIEtERSBHVUkuIgotbXNnc3RyICJjb24gR1VJIEtERS4iCi0KIG1zZ2lkICIgIEZlYXR1cmVzIGluY2x1ZGVkICgrKSBvciBub3QgKC0pOlxuIgogbXNnc3RyICIgIE9wemlvbmkgaW5jbHVzZSAoKykgbyBlc2NsdXNlICgtKTpcbiIKIApAQCAtNTg2Miw3ICs1ODU2LDcgQEAKIG1zZ3N0ciAiRTQ5OiBRdWFudGl04CBkaSAnc2Nyb2xsJyBub24gdmFsaWRhIgogCiBtc2dpZCAiRTkxOiAnc2hlbGwnIG9wdGlvbiBpcyBlbXB0eSIKLW1zZ3N0ciAiRTkxOiBvcHppb25lICdzaGVsbCcgdnVvdGEiCittc2dzdHIgIkU5MTogb3B6aW9uZSAnc2hlbGwnIG5vbiBpbXBvc3RhdGEiCiAKIG1zZ2lkICJFMjU1OiBDb3VsZG4ndCByZWFkIGluIHNpZ24gZGF0YSEiCiBtc2dzdHIgIkUyNTU6IEVycm9yZSAtLSBub24gc29ubyByaXVzY2l0byBhIGxlZ2dlcmUgaSBkYXRpIGRlbCAnc2lnbichIgpAQCAtNTg3MSw3ICs1ODY1LDcgQEAKIG1zZ3N0ciAiRTcyOiBFcnJvcmUgZHVyYW50ZSBjaGl1c3VyYSBzd2FwIGZpbGUiCiAKIG1zZ2lkICJFNzM6IHRhZyBzdGFjayBlbXB0eSIKLW1zZ3N0ciAiRTczOiB0YWcgc3RhY2sgdnVvdGEiCittc2dzdHIgIkU3MzogdGFnIHN0YWNrIG5vbiBpbXBvc3RhdGEiCiAKIG1zZ2lkICJFNzQ6IENvbW1hbmQgdG9vIGNvbXBsZXgiCiBtc2dzdHIgIkU3NDogQ29tYW5kbyB0cm9wcG8gY29tcGxlc3NvIgpAQCAtNTkzMywzICs1OTI3LDEzIEBACiAKIG1zZ2lkICJFMTM5OiBGaWxlIGlzIGxvYWRlZCBpbiBhbm90aGVyIGJ1ZmZlciIKIG1zZ3N0ciAiRTEzOTogRmlsZSBnaeAgY2FyaWNhdG8gaW4gdW4gYWx0cm8gYnVmZmVyIgorCisjLCBjLWZvcm1hdAorbXNnaWQgIkU3NjQ6IE9wdGlvbiAnJXMnIGlzIG5vdCBzZXQiCittc2dzdHIgIkU3NjQ6IG9wemlvbmUgJyVzJyBub24gaW1wb3N0YXRhIgorCittc2dpZCAic2VhcmNoIGhpdCBUT1AsIGNvbnRpbnVpbmcgYXQgQk9UVE9NIgorbXNnc3RyICJyYWdnaXVudGEgbGEgQ0lNQSBuZWxsYSByaWNlcmNhLCBjb250aW51byBkYWwgRk9ORE8iCisKK21zZ2lkICJzZWFyY2ggaGl0IEJPVFRPTSwgY29udGludWluZyBhdCBUT1AiCittc2dzdHIgInJhZ2dpdW50byBpbCBGT05ETyBuZWxsYSByaWNlcmNhLCBjb250aW51byBkYWxsYSBDSU1BIgpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL2V2YWwucHJvIGIvc3JjL3Byb3RvL2V2YWwucHJvCmluZGV4IDdjMGNhODQuLjBiNzZmZjYgMTAwNjQ0Ci0tLSBhL3NyYy9wcm90by9ldmFsLnBybworKysgYi9zcmMvcHJvdG8vZXZhbC5wcm8KQEAgLTYxLDYgKzYxLDcgQEAKIGNoYXJfdSAqdl9leGNlcHRpb24gX19BUkdTKChjaGFyX3UgKm9sZHZhbCkpOwogY2hhcl91ICp2X3Rocm93cG9pbnQgX19BUkdTKChjaGFyX3UgKm9sZHZhbCkpOwogY2hhcl91ICpzZXRfY21kYXJnIF9fQVJHUygoZXhhcmdfVCAqZWFwLCBjaGFyX3UgKm9sZGFyZykpOwordm9pZCBmcmVlX3R2IF9fQVJHUygodHlwdmFsX1QgKnZhcnApKTsKIHZvaWQgY2xlYXJfdHYgX19BUkdTKCh0eXB2YWxfVCAqdmFycCkpOwogbG9uZyBnZXRfdHZfbnVtYmVyX2NoayBfX0FSR1MoKHR5cHZhbF9UICp2YXJwLCBpbnQgKmRlbm90ZSkpOwogY2hhcl91ICpnZXRfdHZfc3RyaW5nX2NoayBfX0FSR1MoKHR5cHZhbF9UICp2YXJwKSk7CmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vaGFzaHRhYmxlLnBybyBiL3NyYy9wcm90by9oYXNodGFibGUucHJvCmluZGV4IGFlYmI0NTguLjkwNzIzNzYgMTAwNjQ0Ci0tLSBhL3NyYy9wcm90by9oYXNodGFibGUucHJvCisrKyBiL3NyYy9wcm90by9oYXNodGFibGUucHJvCkBAIC0xLDYgKzEsNyBAQAogLyogaGFzaHRhYmxlLmMgKi8KIHZvaWQgaGFzaF9pbml0IF9fQVJHUygoaGFzaHRhYl9UICpodCkpOwogdm9pZCBoYXNoX2NsZWFyIF9fQVJHUygoaGFzaHRhYl9UICpodCkpOwordm9pZCBoYXNoX2NsZWFyX2FsbCBfX0FSR1MoKGhhc2h0YWJfVCAqaHQsIGludCBvZmYpKTsKIGhhc2hpdGVtX1QgKmhhc2hfZmluZCBfX0FSR1MoKGhhc2h0YWJfVCAqaHQsIGNoYXJfdSAqa2V5KSk7CiBoYXNoaXRlbV9UICpoYXNoX2xvb2t1cCBfX0FSR1MoKGhhc2h0YWJfVCAqaHQsIGNoYXJfdSAqa2V5LCBoYXNoX1QgaGFzaCkpOwogdm9pZCBoYXNoX2RlYnVnX3Jlc3VsdHMgX19BUkdTKCh2b2lkKSk7CmRpZmYgLS1naXQgYS9zcmMvcHJvdG8vbWVtbGluZS5wcm8gYi9zcmMvcHJvdG8vbWVtbGluZS5wcm8KaW5kZXggOTBkMzI4NS4uZGU3NWE3ZCAxMDA2NDQKLS0tIGEvc3JjL3Byb3RvL21lbWxpbmUucHJvCisrKyBiL3NyYy9wcm90by9tZW1saW5lLnBybwpAQCAtMSwzMiArMSwzMyBAQAogLyogbWVtbGluZS5jICovCi1leHRlcm4gaW50IG1sX29wZW4gX19BUkdTKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBtbF9zZXRuYW1lIF9fQVJHUygoYnVmX1QgKmJ1ZikpOwotZXh0ZXJuIHZvaWQgbWxfb3Blbl9maWxlcyBfX0FSR1MoKHZvaWQpKTsKLWV4dGVybiB2b2lkIG1sX29wZW5fZmlsZSBfX0FSR1MoKGJ1Zl9UICpidWYpKTsKLWV4dGVybiB2b2lkIGNoZWNrX25lZWRfc3dhcCBfX0FSR1MoKGludCBuZXdmaWxlKSk7Ci1leHRlcm4gdm9pZCBtbF9jbG9zZSBfX0FSR1MoKGJ1Zl9UICpidWYsIGludCBkZWxfZmlsZSkpOwotZXh0ZXJuIHZvaWQgbWxfY2xvc2VfYWxsIF9fQVJHUygoaW50IGRlbF9maWxlKSk7Ci1leHRlcm4gdm9pZCBtbF9jbG9zZV9ub3Rtb2QgX19BUkdTKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBtbF90aW1lc3RhbXAgX19BUkdTKChidWZfVCAqYnVmKSk7Ci1leHRlcm4gdm9pZCBtbF9yZWNvdmVyIF9fQVJHUygodm9pZCkpOwotZXh0ZXJuIGludCByZWNvdmVyX25hbWVzIF9fQVJHUygoY2hhcl91ICoqZm5hbWUsIGludCBsaXN0LCBpbnQgbnIpKTsKLWV4dGVybiB2b2lkIG1sX3N5bmNfYWxsIF9fQVJHUygoaW50IGNoZWNrX2ZpbGUsIGludCBjaGVja19jaGFyKSk7Ci1leHRlcm4gdm9pZCBtbF9wcmVzZXJ2ZSBfX0FSR1MoKGJ1Zl9UICpidWYsIGludCBtZXNzYWdlKSk7Ci1leHRlcm4gY2hhcl91ICptbF9nZXQgX19BUkdTKChsaW5lbnJfVCBsbnVtKSk7Ci1leHRlcm4gY2hhcl91ICptbF9nZXRfcG9zIF9fQVJHUygocG9zX1QgKnBvcykpOwotZXh0ZXJuIGNoYXJfdSAqbWxfZ2V0X2N1cmxpbmUgX19BUkdTKCh2b2lkKSk7Ci1leHRlcm4gY2hhcl91ICptbF9nZXRfY3Vyc29yIF9fQVJHUygodm9pZCkpOwotZXh0ZXJuIGNoYXJfdSAqbWxfZ2V0X2J1ZiBfX0FSR1MoKGJ1Zl9UICpidWYsIGxpbmVucl9UIGxudW0sIGludCB3aWxsX2NoYW5nZSkpOwotZXh0ZXJuIGludCBtbF9saW5lX2FsbG9jZWQgX19BUkdTKCh2b2lkKSk7Ci1leHRlcm4gaW50IG1sX2FwcGVuZCBfX0FSR1MoKGxpbmVucl9UIGxudW0sIGNoYXJfdSAqbGluZSwgY29sbnJfVCBsZW4sIGludCBuZXdmaWxlKSk7Ci1leHRlcm4gaW50IG1sX3JlcGxhY2UgX19BUkdTKChsaW5lbnJfVCBsbnVtLCBjaGFyX3UgKmxpbmUsIGludCBjb3B5KSk7Ci1leHRlcm4gaW50IG1sX2RlbGV0ZSBfX0FSR1MoKGxpbmVucl9UIGxudW0sIGludCBtZXNzYWdlKSk7Ci1leHRlcm4gdm9pZCBtbF9zZXRtYXJrZWQgX19BUkdTKChsaW5lbnJfVCBsbnVtKSk7Ci1leHRlcm4gbGluZW5yX1QgbWxfZmlyc3RtYXJrZWQgX19BUkdTKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBtbF9jbGVhcm1hcmtlZCBfX0FSR1MoKHZvaWQpKTsKLWV4dGVybiBjaGFyX3UgKm1ha2Vzd2FwbmFtZSBfX0FSR1MoKGNoYXJfdSAqZm5hbWUsIGNoYXJfdSAqZmZuYW1lLCBidWZfVCAqYnVmLCBjaGFyX3UgKmRpcl9uYW1lKSk7Ci1leHRlcm4gY2hhcl91ICpnZXRfZmlsZV9pbl9kaXIgX19BUkdTKChjaGFyX3UgKmZuYW1lLCBjaGFyX3UgKmRuYW1lKSk7Ci1leHRlcm4gdm9pZCBtbF9zZXRmbGFncyBfX0FSR1MoKGJ1Zl9UICpidWYpKTsKLWV4dGVybiBsb25nIG1sX2ZpbmRfbGluZV9vcl9vZmZzZXQgX19BUkdTKChidWZfVCAqYnVmLCBsaW5lbnJfVCBsbnVtLCBsb25nICpvZmZwKSk7Ci1leHRlcm4gdm9pZCBnb3RvX2J5dGUgX19BUkdTKChsb25nIGNudCkpOworaW50IG1sX29wZW4gX19BUkdTKChidWZfVCAqYnVmKSk7Cit2b2lkIG1sX3NldG5hbWUgX19BUkdTKChidWZfVCAqYnVmKSk7Cit2b2lkIG1sX29wZW5fZmlsZXMgX19BUkdTKCh2b2lkKSk7Cit2b2lkIG1sX29wZW5fZmlsZSBfX0FSR1MoKGJ1Zl9UICpidWYpKTsKK3ZvaWQgY2hlY2tfbmVlZF9zd2FwIF9fQVJHUygoaW50IG5ld2ZpbGUpKTsKK3ZvaWQgbWxfY2xvc2UgX19BUkdTKChidWZfVCAqYnVmLCBpbnQgZGVsX2ZpbGUpKTsKK3ZvaWQgbWxfY2xvc2VfYWxsIF9fQVJHUygoaW50IGRlbF9maWxlKSk7Cit2b2lkIG1sX2Nsb3NlX25vdG1vZCBfX0FSR1MoKHZvaWQpKTsKK3ZvaWQgbWxfdGltZXN0YW1wIF9fQVJHUygoYnVmX1QgKmJ1ZikpOwordm9pZCBtbF9yZWNvdmVyIF9fQVJHUygodm9pZCkpOworaW50IHJlY292ZXJfbmFtZXMgX19BUkdTKChjaGFyX3UgKipmbmFtZSwgaW50IGxpc3QsIGludCBucikpOwordm9pZCBtbF9zeW5jX2FsbCBfX0FSR1MoKGludCBjaGVja19maWxlLCBpbnQgY2hlY2tfY2hhcikpOwordm9pZCBtbF9wcmVzZXJ2ZSBfX0FSR1MoKGJ1Zl9UICpidWYsIGludCBtZXNzYWdlKSk7CitjaGFyX3UgKm1sX2dldCBfX0FSR1MoKGxpbmVucl9UIGxudW0pKTsKK2NoYXJfdSAqbWxfZ2V0X3BvcyBfX0FSR1MoKHBvc19UICpwb3MpKTsKK2NoYXJfdSAqbWxfZ2V0X2N1cmxpbmUgX19BUkdTKCh2b2lkKSk7CitjaGFyX3UgKm1sX2dldF9jdXJzb3IgX19BUkdTKCh2b2lkKSk7CitjaGFyX3UgKm1sX2dldF9idWYgX19BUkdTKChidWZfVCAqYnVmLCBsaW5lbnJfVCBsbnVtLCBpbnQgd2lsbF9jaGFuZ2UpKTsKK2ludCBtbF9saW5lX2FsbG9jZWQgX19BUkdTKCh2b2lkKSk7CitpbnQgbWxfYXBwZW5kIF9fQVJHUygobGluZW5yX1QgbG51bSwgY2hhcl91ICpsaW5lLCBjb2xucl9UIGxlbiwgaW50IG5ld2ZpbGUpKTsKK2ludCBtbF9hcHBlbmRfYnVmIF9fQVJHUygoYnVmX1QgKmJ1ZiwgbGluZW5yX1QgbG51bSwgY2hhcl91ICpsaW5lLCBjb2xucl9UIGxlbiwgaW50IG5ld2ZpbGUpKTsKK2ludCBtbF9yZXBsYWNlIF9fQVJHUygobGluZW5yX1QgbG51bSwgY2hhcl91ICpsaW5lLCBpbnQgY29weSkpOworaW50IG1sX2RlbGV0ZSBfX0FSR1MoKGxpbmVucl9UIGxudW0sIGludCBtZXNzYWdlKSk7Cit2b2lkIG1sX3NldG1hcmtlZCBfX0FSR1MoKGxpbmVucl9UIGxudW0pKTsKK2xpbmVucl9UIG1sX2ZpcnN0bWFya2VkIF9fQVJHUygodm9pZCkpOwordm9pZCBtbF9jbGVhcm1hcmtlZCBfX0FSR1MoKHZvaWQpKTsKK2NoYXJfdSAqbWFrZXN3YXBuYW1lIF9fQVJHUygoY2hhcl91ICpmbmFtZSwgY2hhcl91ICpmZm5hbWUsIGJ1Zl9UICpidWYsIGNoYXJfdSAqZGlyX25hbWUpKTsKK2NoYXJfdSAqZ2V0X2ZpbGVfaW5fZGlyIF9fQVJHUygoY2hhcl91ICpmbmFtZSwgY2hhcl91ICpkbmFtZSkpOwordm9pZCBtbF9zZXRmbGFncyBfX0FSR1MoKGJ1Zl9UICpidWYpKTsKK2xvbmcgbWxfZmluZF9saW5lX29yX29mZnNldCBfX0FSR1MoKGJ1Zl9UICpidWYsIGxpbmVucl9UIGxudW0sIGxvbmcgKm9mZnApKTsKK3ZvaWQgZ290b19ieXRlIF9fQVJHUygobG9uZyBjbnQpKTsKIC8qIHZpbTogc2V0IGZ0PWMgOiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL3NwZWxsLnBybyBiL3NyYy9wcm90by9zcGVsbC5wcm8KaW5kZXggODcyNjFhMi4uNzkxZWMyNCAxMDA2NDQKLS0tIGEvc3JjL3Byb3RvL3NwZWxsLnBybworKysgYi9zcmMvcHJvdG8vc3BlbGwucHJvCkBAIC0xLDUgKzEsNSBAQAogLyogc3BlbGwuYyAqLwotaW50IHNwZWxsX2NoZWNrIF9fQVJHUygod2luX1QgKndwLCBjaGFyX3UgKnB0ciwgaGxmX1QgKmF0dHJwLCBpbnQgKmNhcGNvbCkpOworaW50IHNwZWxsX2NoZWNrIF9fQVJHUygod2luX1QgKndwLCBjaGFyX3UgKnB0ciwgaGxmX1QgKmF0dHJwLCBpbnQgKmNhcGNvbCwgaW50IGRvY291bnQpKTsKIGludCBzcGVsbF9tb3ZlX3RvIF9fQVJHUygod2luX1QgKndwLCBpbnQgZGlyLCBpbnQgYWxsd29yZHMsIGludCBjdXJsaW5lLCBobGZfVCAqYXR0cnApKTsKIHZvaWQgc3BlbGxfY2F0X2xpbmUgX19BUkdTKChjaGFyX3UgKmJ1ZiwgY2hhcl91ICpsaW5lLCBpbnQgbWF4bGVuKSk7CiBjaGFyX3UgKmRpZF9zZXRfc3BlbGxsYW5nIF9fQVJHUygoYnVmX1QgKmJ1ZikpOwpAQCAtMTQsNyArMTQsNyBAQAogaW50IHNwZWxsX2NoZWNrX3NwcyBfX0FSR1MoKHZvaWQpKTsKIHZvaWQgc3BlbGxfc3VnZ2VzdCBfX0FSR1MoKGludCBjb3VudCkpOwogdm9pZCBleF9zcGVsbHJlcGFsbCBfX0FSR1MoKGV4YXJnX1QgKmVhcCkpOwotdm9pZCBzcGVsbF9zdWdnZXN0X2xpc3QgX19BUkdTKChnYXJyYXlfVCAqZ2FwLCBjaGFyX3UgKndvcmQsIGludCBtYXhjb3VudCwgaW50IG5lZWRfY2FwKSk7Cit2b2lkIHNwZWxsX3N1Z2dlc3RfbGlzdCBfX0FSR1MoKGdhcnJheV9UICpnYXAsIGNoYXJfdSAqd29yZCwgaW50IG1heGNvdW50LCBpbnQgbmVlZF9jYXAsIGludCBpbnRlcmFjdGl2ZSkpOwogY2hhcl91ICpldmFsX3NvdW5kZm9sZCBfX0FSR1MoKGNoYXJfdSAqd29yZCkpOwogdm9pZCBleF9zcGVsbGR1bXAgX19BUkdTKChleGFyZ19UICplYXApKTsKIGNoYXJfdSAqc3BlbGxfdG9fd29yZF9lbmQgX19BUkdTKChjaGFyX3UgKnN0YXJ0LCBidWZfVCAqYnVmKSk7CmRpZmYgLS1naXQgYS9zcmMvcXVpY2tmaXguYyBiL3NyYy9xdWlja2ZpeC5jCmluZGV4IGQwYTJlMTUuLmY1NTBmMTEgMTAwNjQ0Ci0tLSBhL3NyYy9xdWlja2ZpeC5jCisrKyBiL3NyYy9xdWlja2ZpeC5jCkBAIC04Niw2ICs4Niw3IEBACiAJCQkJLyogICAnTycgb3ZlcnJlYWQgKHBhcnRpYWwpIG1lc3NhZ2UgKi8KICAgICBjaGFyX3UJICAgIGZsYWdzOwkvKiBhZGRpdGlvbmFsIGZsYWdzIGdpdmVuIGluIHByZWZpeCAqLwogCQkJCS8qICAgJy0nIGRvIG5vdCBpbmNsdWRlIHRoaXMgbGluZSAqLworCQkJCS8qICAgJysnIGluY2x1ZGUgd2hvbGUgbGluZSBpbiBtZXNzYWdlICovCiB9OwogCiBzdGF0aWMgaW50CXFmX2luaXRfZXh0IF9fQVJHUygoY2hhcl91ICplZmlsZSwgYnVmX1QgKmJ1ZiwgdHlwdmFsX1QgKnR2LCBjaGFyX3UgKmVycm9yZm9ybWF0LCBpbnQgbmV3bGlzdCwgbGluZW5yX1QgbG51bWZpcnN0LCBsaW5lbnJfVCBsbnVtbGFzdCkpOwpAQCAtNTc4LDcgKzU3OSw3IEBACiAJCSAgICBjb2wgPSAoaW50KWF0b2woKGNoYXIgKilyZWdtYXRjaC5zdGFydHBbaV0pOwogCQlpZiAoKGkgPSAoaW50KWZtdF9wdHItPmFkZHJbNF0pID4gMCkJCS8qICV0ICovCiAJCSAgICB0eXBlID0gKnJlZ21hdGNoLnN0YXJ0cFtpXTsKLQkJaWYgKGZtdF9wdHItPmZsYWdzID09ICAnKycgJiYgIW11bHRpc2NhbikJLyogJSsgKi8KKwkJaWYgKGZtdF9wdHItPmZsYWdzID09ICcrJyAmJiAhbXVsdGlzY2FuKQkvKiAlKyAqLwogCQkgICAgU1RSQ1BZKGVycm1zZywgSU9idWZmKTsKIAkJZWxzZSBpZiAoKGkgPSAoaW50KWZtdF9wdHItPmFkZHJbNV0pID4gMCkJLyogJW0gKi8KIAkJewpAQCAtNjEzLDkgKzYxNCw5IEBACiAJICAgIH0KIAl9CiAJbXVsdGlzY2FuID0gRkFMU0U7Ci0JaWYgKCFmbXRfcHRyIHx8IGlkeCA9PSAnRCcgfHwgaWR4ID09ICdYJykKKwlpZiAoZm10X3B0ciA9PSBOVUxMIHx8IGlkeCA9PSAnRCcgfHwgaWR4ID09ICdYJykKIAl7Ci0JICAgIGlmIChmbXRfcHRyKQorCSAgICBpZiAoZm10X3B0ciAhPSBOVUxMKQogCSAgICB7CiAJCWlmIChpZHggPT0gJ0QnKQkJCQkvKiBlbnRlciBkaXJlY3RvcnkgKi8KIAkJewpAQCAtNjM0LDEwICs2MzUsMTAgQEAKIAkgICAgbG51bSA9IDA7CQkJLyogZG9uJ3QganVtcCB0byB0aGlzIGxpbmUgKi8KIAkgICAgdmFsaWQgPSBGQUxTRTsKIAkgICAgU1RSQ1BZKGVycm1zZywgSU9idWZmKTsJLyogY29weSB3aG9sZSBsaW5lIHRvIGVycm9yIG1lc3NhZ2UgKi8KLQkgICAgaWYgKCFmbXRfcHRyKQorCSAgICBpZiAoZm10X3B0ciA9PSBOVUxMKQogCQltdWx0aWxpbmUgPSBtdWx0aWlnbm9yZSA9IEZBTFNFOwogCX0KLQllbHNlIGlmIChmbXRfcHRyKQorCWVsc2UgaWYgKGZtdF9wdHIgIT0gTlVMTCkKIAl7CiAJICAgIGlmICh2aW1fc3RyY2hyKChjaGFyX3UgKikiQUVXSSIsIGlkeCkgIT0gTlVMTCkKIAkJbXVsdGlsaW5lID0gVFJVRTsJLyogc3RhcnQgb2YgYSBtdWx0aS1saW5lIG1lc3NhZ2UgKi8KQEAgLTI3NDcsNyArMjc0OCw3IEBACiAgICAgLyogTmVlZCB0byBzZXQgdGhlIGZpbGVuYW1lIGZvciBhdXRvY29tbWFuZHMuICovCiAgICAgKHZvaWQpc2V0Zm5hbWUoY3VyYnVmLCBmbmFtZSwgTlVMTCwgRkFMU0UpOwogCi0gICAgaWYgKG1sX29wZW4oKSA9PSBPSykKKyAgICBpZiAobWxfb3BlbihjdXJidWYpID09IE9LKQogICAgIHsKIAkvKiBDcmVhdGUgc3dhcCBmaWxlIG5vdyB0byBhdm9pZCB0aGUgQVRURU5USU9OIG1lc3NhZ2UuICovCiAJY2hlY2tfbmVlZF9zd2FwKFRSVUUpOwpAQCAtMjk3OCw3ICsyOTc5LDcgQEAKIAogI2lmIGRlZmluZWQoRkVBVF9FVkFMKSB8fCBkZWZpbmVkKFBST1RPKQogLyoKLSAqICI6Y2V4cHIge2V4cHJ9IiBjb21tYW5kLgorICogIjpjZXhwciB7ZXhwcn0iIGFuZCAiOmNhZGRleHByIHtleHByfSIgY29tbWFuZC4KICAqLwogICAgIHZvaWQKIGV4X2NleHByKGVhcCkKQEAgLTI5ODYsMTYgKzI5ODcsMjMgQEAKIHsKICAgICB0eXB2YWxfVAkqdHY7CiAKKyAgICAvKiBFdmFsdWF0ZSB0aGUgZXhwcmVzc2lvbi4gIFdoZW4gdGhlIHJlc3VsdCBpcyBhIHN0cmluZyBvciBhIGxpc3Qgd2UgY2FuCisgICAgICogdXNlIGl0IHRvIGZpbGwgdGhlIGVycm9ybGlzdC4gKi8KICAgICB0diA9IGV2YWxfZXhwcihlYXAtPmFyZywgTlVMTCk7Ci0gICAgaWYgKCF0diB8fCAodHYtPnZfdHlwZSAhPSBWQVJfU1RSSU5HICYmIHR2LT52X3R5cGUgIT0gVkFSX0xJU1QpIHx8Ci0JKHR2LT52X3R5cGUgPT0gVkFSX1NUUklORyAmJiAhdHYtPnZ2YWwudl9zdHJpbmcpIHx8Ci0JKHR2LT52X3R5cGUgPT0gVkFSX0xJU1QgJiYgIXR2LT52dmFsLnZfbGlzdCkpCi0JcmV0dXJuOwotCi0gICAgaWYgKHFmX2luaXRfZXh0KE5VTEwsIE5VTEwsIHR2LCBwX2VmbSwgVFJVRSwgKGxpbmVucl9UKTAsIChsaW5lbnJfVCkwKSA+IDApCi0JcWZfanVtcCgwLCAwLCBlYXAtPmZvcmNlaXQpOwkJLyogZGlzcGxheSBmaXJzdCBlcnJvciAqLwotCi0gICAgY2xlYXJfdHYodHYpOworICAgIGlmICh0diAhPSBOVUxMKQorICAgIHsKKwlpZiAoKHR2LT52X3R5cGUgPT0gVkFSX1NUUklORyAmJiB0di0+dnZhbC52X3N0cmluZyAhPSBOVUxMKQorCQl8fCAodHYtPnZfdHlwZSA9PSBWQVJfTElTVCAmJiB0di0+dnZhbC52X2xpc3QgIT0gTlVMTCkpCisJeworCSAgICBpZiAocWZfaW5pdF9leHQoTlVMTCwgTlVMTCwgdHYsIHBfZWZtLCBlYXAtPmNtZGlkeCA9PSBDTURfY2V4cHIsCisJCQkJCQkgKGxpbmVucl9UKTAsIChsaW5lbnJfVCkwKSA+IDAKKwkJICAgICYmIGVhcC0+Y21kaWR4ID09IENNRF9jZXhwcikKKwkJcWZfanVtcCgwLCAwLCBlYXAtPmZvcmNlaXQpOwkvKiBkaXNwbGF5IGZpcnN0IGVycm9yICovCisJfQorCWVsc2UKKwkgICAgRU1TRyhfKCJFOTk5OiBTdHJpbmcgb3IgTGlzdCBleHBlY3RlZCIpKTsKKwlmcmVlX3R2KHR2KTsKKyAgICB9CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvc3JjL3NjcmVlbi5jIGIvc3JjL3NjcmVlbi5jCmluZGV4IDA5ODIxYmQuLmZiNTU5MzQgMTAwNjQ0Ci0tLSBhL3NyYy9zY3JlZW4uYworKysgYi9zcmMvc2NyZWVuLmMKQEAgLTEzNCw3ICsxMzQsNyBAQAogc3RhdGljIHZvaWQgZmlsbF9mb2xkY29sdW1uIF9fQVJHUygoY2hhcl91ICpwLCB3aW5fVCAqd3AsIGludCBjbG9zZWQsIGxpbmVucl9UIGxudW0pKTsKIHN0YXRpYyB2b2lkIGNvcHlfdGV4dF9hdHRyIF9fQVJHUygoaW50IG9mZiwgY2hhcl91ICpidWYsIGludCBsZW4sIGludCBhdHRyKSk7CiAjZW5kaWYKLXN0YXRpYyBpbnQgd2luX2xpbmUgX19BUkdTKCh3aW5fVCAqLCBsaW5lbnJfVCwgaW50LCBpbnQpKTsKK3N0YXRpYyBpbnQgd2luX2xpbmUgX19BUkdTKCh3aW5fVCAqLCBsaW5lbnJfVCwgaW50LCBpbnQsIGludCBub2NoYW5nZSkpOwogc3RhdGljIGludCBjaGFyX25lZWRzX3JlZHJhdyBfX0FSR1MoKGludCBvZmZfZnJvbSwgaW50IG9mZl90bywgaW50IGNvbHMpKTsKICNpZmRlZiBGRUFUX1JJR0hUTEVGVAogc3RhdGljIHZvaWQgc2NyZWVuX2xpbmUgX19BUkdTKChpbnQgcm93LCBpbnQgY29sb2ZmLCBpbnQgZW5kY29sLCBpbnQgY2xlYXJfd2lkdGgsIGludCBybGZsYWcpKTsKQEAgLTE2ODEsNyArMTY4MSw3IEBACiAJCS8qCiAJCSAqIERpc3BsYXkgb25lIGxpbmUuCiAJCSAqLwotCQlyb3cgPSB3aW5fbGluZSh3cCwgbG51bSwgc3Jvdywgd3AtPndfaGVpZ2h0KTsKKwkJcm93ID0gd2luX2xpbmUod3AsIGxudW0sIHNyb3csIHdwLT53X2hlaWdodCwgbW9kX3RvcCA9PSAwKTsKIAogI2lmZGVmIEZFQVRfRk9MRElORwogCQl3cC0+d19saW5lc1tpZHhdLndsX2ZvbGRlZCA9IEZBTFNFOwpAQCAtMjQ0NiwxMiArMjQ0NiwxNCBAQAogICoKICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGxhc3Qgcm93IHRoZSBsaW5lIG9jY3VwaWVzLgogICovCisvKiBBUkdTVVNFRCAqLwogICAgIHN0YXRpYyBpbnQKLXdpbl9saW5lKHdwLCBsbnVtLCBzdGFydHJvdywgZW5kcm93KQord2luX2xpbmUod3AsIGxudW0sIHN0YXJ0cm93LCBlbmRyb3csIG5vY2hhbmdlKQogICAgIHdpbl9UCSp3cDsKICAgICBsaW5lbnJfVAlsbnVtOwogICAgIGludAkJc3RhcnRyb3c7CiAgICAgaW50CQllbmRyb3c7CisgICAgaW50CQlub2NoYW5nZTsJCS8qIG5vdCB1cGRhdGluZyBmb3IgY2hhbmdlZCB0ZXh0ICovCiB7CiAgICAgaW50CQljb2w7CQkJLyogdmlzdWFsIGNvbHVtbiBvbiBzY3JlZW4gKi8KICAgICB1bnNpZ25lZAlvZmY7CQkJLyogb2Zmc2V0IGluIFNjcmVlbkxpbmVzL1NjcmVlbkF0dHJzICovCkBAIC0zNzQ0LDcgKzM3NDYsOCBAQAogCQkJZWxzZQogCQkJICAgIHAgPSBwcmV2X3B0cjsKIAkJCWNhcF9jb2wgLT0gKHByZXZfcHRyIC0gbGluZSk7Ci0JCQlsZW4gPSBzcGVsbF9jaGVjayh3cCwgcCwgJnNwZWxsX2hsZiwgJmNhcF9jb2wpOworCQkJbGVuID0gc3BlbGxfY2hlY2sod3AsIHAsICZzcGVsbF9obGYsICZjYXBfY29sLAorCQkJCQkJCQkgICAgbm9jaGFuZ2UpOwogCQkJd29yZF9lbmQgPSB2ICsgbGVuOwogCiAJCQkvKiBJbiBJbnNlcnQgbW9kZSBvbmx5IGhpZ2hsaWdodCBhIHdvcmQgdGhhdApkaWZmIC0tZ2l0IGEvc3JjL3NwZWxsLmMgYi9zcmMvc3BlbGwuYwppbmRleCBmZmU1YTIwLi5hMWFiODljIDEwMDY0NAotLS0gYS9zcmMvc3BlbGwuYworKysgYi9zcmMvc3BlbGwuYwpAQCAtNDMsNiArNDMsOSBAQAogICoKICAqIFRoYW5rcyB0byBPbGFmIFNlaWJlcnQgZm9yIHByb3ZpZGluZyBhbiBleGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgdHJlZQogICogYW5kIHRoZSBjb21wcmVzc2lvbiBtZWNoYW5pc20uCisgKiBMWiB0cmllIGlkZWFzOgorICoJaHR0cDovL3d3dy5pcmIuaHIvaHIvaG9tZS9yaXN0b3YvcGFwZXJzL1Jpc3RvdkxadHJpZVJldmlzaW9uMS5wZGYKKyAqIE1vcmUgcGFwZXJzOiBodHRwOi8vd3d3LWlnbS51bml2LW1sdi5mci9+bGFwb3J0ZS9wdWJsaV9lbi5odG1sCiAgKgogICogTWF0Y2hpbmcgaW52b2x2ZXMgY2hlY2tpbmcgdGhlIGNhcHMgdHlwZTogT25lY2FwIEFMTENBUCBLZWVwQ2FwLgogICoKQEAgLTU2LDE3ICs1OSwyOCBAQAogIyBkZWZpbmUgU1BFTExfUFJJTlRUUkVFCiAjZW5kaWYKIAorLyogVXNlIERFQlVHX1RSSUVXQUxLIHRvIHByaW50IHRoZSBjaGFuZ2VzIG1hZGUgaW4gc3VnZ2VzdF90cmllX3dhbGsoKS4gKi8KKyNpZiAwCisjIGRlZmluZSBERUJVR19UUklFV0FMSworI2VuZGlmCisKIC8qCiAgKiBVc2UgdGhpcyB0byBhZGp1c3QgdGhlIHNjb3JlIGFmdGVyIGZpbmRpbmcgc3VnZ2VzdGlvbnMsIGJhc2VkIG9uIHRoZQogICogc3VnZ2VzdGVkIHdvcmQgc291bmRpbmcgbGlrZSB0aGUgYmFkIHdvcmQuICBUaGlzIGlzIG11Y2ggZmFzdGVyIHRoYW4gZG9pbmcKICAqIGl0IGZvciBldmVyeSBwb3NzaWJsZSBzdWdnZXN0aW9uLgotICogRGlzYWR2YW50YWdlOiBXaGVuICJ0aGUiIGlzIHR5cGVkIGFzICJodGUiIGl0IHNvdW5kcyBkaWZmZXJlbnQgYW5kIGdvZXMKLSAqIGRvd24gaW4gdGhlIGxpc3QuCisgKiBEaXNhZHZhbnRhZ2U6IFdoZW4gInRoZSIgaXMgdHlwZWQgYXMgImh0ZSIgaXQgc291bmRzIHF1aXRlIGRpZmZlcmVudCAoIkAiCisgKiB2cyAiaHQiKSBhbmQgZ29lcyBkb3duIGluIHRoZSBsaXN0LgogICogVXNlZCB3aGVuICdzcGVsbHN1Z2dlc3QnIGlzIHNldCB0byAiYmVzdCIuCiAgKi8KICNkZWZpbmUgUkVTQ09SRSh3b3JkX3Njb3JlLCBzb3VuZF9zY29yZSkgKCgzICogd29yZF9zY29yZSArIHNvdW5kX3Njb3JlKSAvIDQpCiAKIC8qCisgKiBEbyB0aGUgb3Bwb3NpdGU6IGJhc2VkIG9uIGEgbWF4aW11bSBlbmQgc2NvcmUgYW5kIGEga25vd24gc291bmQgc2NvcmUsCisgKiBjb21wdXRlIHRoZSB0aGUgbWF4aW11bSB3b3JkIHNjb3JlIHRoYXQgY2FuIGJlIHVzZWQuCisgKi8KKyNkZWZpbmUgTUFYU0NPUkUod29yZF9zY29yZSwgc291bmRfc2NvcmUpICgoNCAqIHdvcmRfc2NvcmUgLSBzb3VuZF9zY29yZSkgLyAzKQorCisvKgogICogVmltIHNwZWxsIGZpbGUgZm9ybWF0OiA8SEVBREVSPgogICoJCQkgIDxTRUNUSU9OUz4KICAqCQkJICA8TFdPUkRUUkVFPgpAQCAtMTMzLDYgKzE0Nyw5IEBACiAgKiA8cmVwdG9sZW4+CSAxIGJ5dGUJICAgIGxlbmd0aCBvZiA8cmVwdG8+CiAgKiA8cmVwdG8+CSBOIGJ5dGVzICAgICJ0byIgcGFydCBvZiByZXBsYWNlbWVudAogICoKKyAqIHNlY3Rpb25JRCA9PSBTTl9SRVBTQUw6IDxyZXBjb3VudD4gPHJlcD4gLi4uCisgKiAgIGp1c3QgbGlrZSBTTl9SRVAgYnV0IGZvciBzb3VuZGZvbGRlZCB3b3JkcworICoKICAqIHNlY3Rpb25JRCA9PSBTTl9TQUw6IDxzYWxmbGFncz4gPHNhbGNvdW50PiA8c2FsPiAuLi4KICAqIDxzYWxmbGFncz4JIDEgYnl0ZQkgICAgZmxhZ3MgZm9yIHNvdW5kc2FsaWtlIGNvbnZlcnNpb246CiAgKgkJCSAgICBTQUxfRjBMTE9XVVAKQEAgLTE1MSw2ICsxNjgsMTIgQEAKICAqIDxzb2ZvdG9sZW4+CSAyIGJ5dGVzICAgIGxlbmd0aCBvZiA8c29mb3RvPgogICogPHNvZm90bz4JIE4gYnl0ZXMgICAgInRvIiBwYXJ0IG9mIHNvdW5kZm9sZAogICoKKyAqIHNlY3Rpb25JRCA9PSBTTl9TVUdGSUxFOiA8dGltZXN0YW1wPgorICogPHRpbWVzdGFtcD4gICA4IGJ5dGVzICAgIHRpbWUgaW4gc2Vjb25kcyB0aGF0IG11c3QgbWF0Y2ggd2l0aCAuc3VnIGZpbGUKKyAqCisgKiBzZWN0aW9uSUQgPT0gU05fV09SRFM6IDx3b3JkPiAuLi4KKyAqIDx3b3JkPgkgTiBieXRlcyAgICBOVUwgdGVybWluYXRlZCBjb21tb24gd29yZAorICoKICAqIHNlY3Rpb25JRCA9PSBTTl9NQVA6IDxtYXBzdHI+CiAgKiA8bWFwc3RyPgkgTiBieXRlcyAgICBTdHJpbmcgd2l0aCBzZXF1ZW5jZXMgb2Ygc2ltaWxhciBjaGFyYWN0ZXJzLAogICoJCQkgICAgc2VwYXJhdGVkIGJ5IHNsYXNoZXMuCkBAIC0yMzYsNiArMjU5LDMyIEBACiAgKiBBbGwgdGV4dCBjaGFyYWN0ZXJzIGFyZSBpbiAnZW5jb2RpbmcnLCBidXQgc3RvcmVkIGFzIHNpbmdsZSBieXRlcy4KICAqLwogCisvKgorICogVmltIC5zdWcgZmlsZSBmb3JtYXQ6ICA8U1VHSEVBREVSPgorICoJCQkgIDxTVUdXT1JEVFJFRT4KKyAqCQkJICA8U1VHVEFCTEU+CisgKgorICogPFNVR0hFQURFUj46IDxmaWxlSUQ+IDx2ZXJzaW9ubnI+IDx0aW1lc3RhbXA+CisgKgorICogPGZpbGVJRD4gICAgIDYgYnl0ZXMgICAgICJWSU1zdWciCisgKiA8dmVyc2lvbm5yPiAgMSBieXRlICAgICAgVklNU1VHVkVSU0lPTgorICogPHRpbWVzdGFtcD4gIDggYnl0ZXMgICAgIHRpbWVzdGFtcCB0aGF0IG11c3QgbWF0Y2ggd2l0aCAuc3BsIGZpbGUKKyAqCisgKgorICogPFNVR1dPUkRUUkVFPjogPHdvcmR0cmVlPiAgKHNlZSBhYm92ZSwgbm8gZmxhZ3Mgb3IgcmVnaW9uIHVzZWQpCisgKgorICoKKyAqIDxTVUdUQUJMRT46IDxzdWd3Y291bnQ+IDxzdWdsaW5lPiAuLi4KKyAqCisgKiA8c3Vnd2NvdW50Pgk0IGJ5dGVzCSAgICBudW1iZXIgb2YgPHN1Z2xpbmU+IGZvbGxvd2luZworICoKKyAqIDxzdWdsaW5lPjogPHN1Z25yPiAuLi4gTlVMCisgKgorICogPHN1Z25yPjogICAgIFggYnl0ZXMgICAgIHdvcmQgbnVtYmVyIHRoYXQgcmVzdWx0cyBpbiB0aGlzIHNvdW5kZm9sZGVkIHdvcmQsCisgKgkJCSAgICBzdG9yZWQgYXMgYW4gb2Zmc2V0IHRvIHRoZSBwcmV2aW91cyBudW1iZXIgaW4gYXMKKyAqCQkJICAgIGZldyBieXRlcyBhcyBwb3NzaWJsZSwgc2VlIG9mZnNldDJieXRlcygpKQorICovCisKICNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTjE2KSB8fCBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU42NCkKICMgaW5jbHVkZSA8aW8uaD4JLyogZm9yIGxzZWVrKCksIG11c3QgYmUgYmVmb3JlIHZpbS5oICovCiAjZW5kaWYKQEAgLTI0OCw2ICsyOTcsMTAgQEAKICMgaW5jbHVkZSA8ZmNudGwuaD4KICNlbmRpZgogCisjaWZuZGVmIFVOSVgJCS8qIGl0J3MgaW4gb3NfdW5peC5oIGZvciBVbml4ICovCisjIGluY2x1ZGUgPHRpbWUuaD4JLyogZm9yIHRpbWVfdCAqLworI2VuZGlmCisKICNkZWZpbmUgTUFYV0xFTiAyNTAJCS8qIEFzc3VtZSBtYXguIHdvcmQgbGVuIGlzIHRoaXMgbWFueSBieXRlcy4KIAkJCQkgICBTb21lIHBsYWNlcyBhc3N1bWUgYSB3b3JkIGxlbmd0aCBmaXRzIGluIGEKIAkJCQkgICBieXRlLCB0aHVzIGl0IGNhbid0IGJlIGFib3ZlIDI1NS4gKi8KQEAgLTMwMiw4ICszNTUsOCBAQAogCQkJCSAqIGZvbGxvdzsgbmV2ZXIgdXNlZCBpbiBwcmVmaXggdHJlZSAqLwogI2RlZmluZSBCWV9TUEVDSUFMICBCWV9GTEFHUzIJLyogaGlnaGVzdCBzcGVjaWFsIGJ5dGUgdmFsdWUgKi8KIAotLyogSW5mbyBmcm9tICJSRVAiIGFuZCAiU0FMIiBlbnRyaWVzIGluICIuYWZmIiBmaWxlIHVzZWQgaW4gc2lfcmVwLCBzbF9yZXAsCi0gKiBhbmQgc2lfc2FsLiAgTm90IGZvciBzbF9zYWwhCisvKiBJbmZvIGZyb20gIlJFUCIsICJSRVBTQUwiIGFuZCAiU0FMIiBlbnRyaWVzIGluICIuYWZmIiBmaWxlIHVzZWQgaW4gc2lfcmVwLAorICogc2lfcmVwc2FsLCBzbF9yZXAsIGFuZCBzaV9zYWwuICBOb3QgZm9yIHNsX3NhbCEKICAqIE9uZSByZXBsYWNlbWVudDogZnJvbSAiZnRfZnJvbSIgdG8gImZ0X3RvIi4gKi8KIHR5cGVkZWYgc3RydWN0IGZyb210b19TCiB7CkBAIC0zNzQsNiArNDI3LDggQEAKIAogICAgIGNoYXJfdQkqc2xfbWlkd29yZDsJLyogTUlEV09SRCBzdHJpbmcgb3IgTlVMTCAqLwogCisgICAgaGFzaHRhYl9UCXNsX3dvcmRjb3VudDsJLyogaGFzaHRhYmxlIHdpdGggd29yZCBjb3VudCwgd29yZGNvdW50X1QgKi8KKwogICAgIGludAkJc2xfY29tcG1heDsJLyogQ09NUE9VTkRNQVggKGRlZmF1bHQ6IE1BWFdMRU4pICovCiAgICAgaW50CQlzbF9jb21wbWlubGVuOwkvKiBDT01QT1VORE1JTiAoZGVmYXVsdDogMCkgKi8KICAgICBpbnQJCXNsX2NvbXBzeWxtYXg7CS8qIENPTVBPVU5EU1lMTUFYIChkZWZhdWx0OiBNQVhXTEVOKSAqLwpAQCAtMzk0LDEyICs0NDksMjMgQEAKICAgICBnYXJyYXlfVAlzbF9zYWw7CQkvKiBsaXN0IG9mIHNhbGl0ZW1fVCBlbnRyaWVzIGZyb20gU0FMIGxpbmVzICovCiAgICAgc2FsZmlyc3RfVAlzbF9zYWxfZmlyc3RbMjU2XTsgIC8qIGluZGV4ZXMgd2hlcmUgYnl0ZSBmaXJzdCBhcHBlYXJzLCAtMSBpZgogCQkJCSAgICAgICB0aGVyZSBpcyBub25lICovCi0gICAgaW50CQlzbF9zb2ZvOwkvKiBTT0ZPRlJPTSBhbmQgU09GT1RPIGluc3RlYWQgb2YgU0FMIGl0ZW1zOgotCQkJCSAqICJzbF9zYWxfZmlyc3QiIG1hcHMgY2hhcnMsIHdoZW4gaGFzX21ieXRlCi0JCQkJICogInNsX3NhbCIgaXMgYSBsaXN0IG9mIHdpZGUgY2hhciBsaXN0cy4gKi8KICAgICBpbnQJCXNsX2ZvbGxvd3VwOwkvKiBTQUwgZm9sbG93dXAgKi8KICAgICBpbnQJCXNsX2NvbGxhcHNlOwkvKiBTQUwgY29sbGFwc2VfcmVzdWx0ICovCiAgICAgaW50CQlzbF9yZW1fYWNjZW50czsJLyogU0FMIHJlbW92ZV9hY2NlbnRzICovCisgICAgaW50CQlzbF9zb2ZvOwkvKiBTT0ZPRlJPTSBhbmQgU09GT1RPIGluc3RlYWQgb2YgU0FMIGl0ZW1zOgorCQkJCSAqICJzbF9zYWxfZmlyc3QiIG1hcHMgY2hhcnMsIHdoZW4gaGFzX21ieXRlCisJCQkJICogInNsX3NhbCIgaXMgYSBsaXN0IG9mIHdpZGUgY2hhciBsaXN0cy4gKi8KKyAgICBnYXJyYXlfVAlzbF9yZXBzYWw7CS8qIGxpc3Qgb2YgZnJvbXRvX1QgZW50cmllcyBmcm9tIFJFUFNBTCBsaW5lcyAqLworICAgIHNob3J0CXNsX3JlcHNhbF9maXJzdFsyNTZdOyAgLyogc2xfcmVwX2ZpcnN0IGZvciBSRVBTQUwgbGluZXMgKi8KKworICAgIC8qIEluZm8gZnJvbSB0aGUgLnN1ZyBmaWxlLiAgTG9hZGVkIG9uIGRlbWFuZC4gKi8KKyAgICB0aW1lX3QJc2xfc3VndGltZTsJLyogdGltZXN0YW1wIGZvciAuc3VnIGZpbGUgKi8KKyAgICBjaGFyX3UJKnNsX3NieXRzOwkvKiBzb3VuZGZvbGRlZCB3b3JkIGJ5dGVzICovCisgICAgaWR4X1QJKnNsX3NpZHhzOwkvKiBzb3VuZGZvbGRlZCB3b3JkIGluZGV4ZXMgKi8KKyAgICBidWZfVAkqc2xfc3VnYnVmOwkvKiBidWZmZXIgd2l0aCB3b3JkIG51bWJlciB0YWJsZSAqLworICAgIGludAkJc2xfc3VnbG9hZGVkOwkvKiBUUlVFIHdoZW4gLnN1ZyBmaWxlIHdhcyBsb2FkZWQgb3IgZmFpbGVkIHRvCisJCQkJICAgbG9hZCAqLworCiAgICAgaW50CQlzbF9oYXNfbWFwOwkvKiBUUlVFIGlmIHRoZXJlIGlzIGEgTUFQIGxpbmUgKi8KICNpZmRlZiBGRUFUX01CWVRFCiAgICAgaGFzaHRhYl9UCXNsX21hcF9oYXNoOwkvKiBNQVAgZm9yIG11bHRpLWJ5dGUgY2hhcnMgKi8KQEAgLTQwNyw2ICs0NzMsOCBAQAogI2Vsc2UKICAgICBjaGFyX3UJc2xfbWFwX2FycmF5WzI1Nl07IC8qIE1BUCBmb3IgZmlyc3QgMjU2IGNoYXJzICovCiAjZW5kaWYKKyAgICBoYXNodGFiX1QJc2xfc291bmRkb25lOwkvKiB0YWJsZSB3aXRoIHNvdW5kZm9sZGVkIHdvcmRzIHRoYXQgaGF2ZQorCQkJCSAgIGhhbmRsZWQsIHNlZSBhZGRfc291bmRfc3VnZ2VzdCgpICovCiB9OwogCiAvKiBGaXJzdCBsYW5ndWFnZSB0aGF0IGlzIGxvYWRlZCwgc3RhcnQgb2YgdGhlIGxpbmtlZCBsaXN0IG9mIGxvYWRlZApAQCAtNDM3LDYgKzUwNSwxMCBAQAogI2RlZmluZSBWSU1TUEVMTE1BR0lDTCA4CiAjZGVmaW5lIFZJTVNQRUxMVkVSU0lPTiA1MAogCisjZGVmaW5lIFZJTVNVR01BR0lDICJWSU1zdWciCS8qIHN0cmluZyBhdCBzdGFydCBvZiBWaW0gLnN1ZyBmaWxlICovCisjZGVmaW5lIFZJTVNVR01BR0lDTCA2CisjZGVmaW5lIFZJTVNVR1ZFUlNJT04gMQorCiAvKiBTZWN0aW9uIElEcy4gIE9ubHkgcmVudW1iZXIgdGhlbSB3aGVuIFZJTVNQRUxMVkVSU0lPTiBjaGFuZ2VzISAqLwogI2RlZmluZSBTTl9SRUdJT04JMAkvKiA8cmVnaW9ubmFtZT4gc2VjdGlvbiAqLwogI2RlZmluZSBTTl9DSEFSRkxBR1MJMQkvKiBjaGFyZmxhZ3Mgc2VjdGlvbiAqLwpAQCAtNDQ5LDYgKzUyMSw5IEBACiAjZGVmaW5lIFNOX0NPTVBPVU5ECTgJLyogY29tcG91bmQgd29yZHMgc2VjdGlvbiAqLwogI2RlZmluZSBTTl9TWUxMQUJMRQk5CS8qIHN5bGxhYmxlIHNlY3Rpb24gKi8KICNkZWZpbmUgU05fTk9CUkVBSwkxMAkvKiBOT0JSRUFLIHNlY3Rpb24gKi8KKyNkZWZpbmUgU05fU1VHRklMRQkxMQkvKiB0aW1lc3RhbXAgZm9yIC5zdWcgZmlsZSAqLworI2RlZmluZSBTTl9SRVBTQUwJMTIJLyogUkVQU0FMIGl0ZW1zIHNlY3Rpb24gKi8KKyNkZWZpbmUgU05fV09SRFMJMTMJLyogY29tbW9uIHdvcmRzICovCiAjZGVmaW5lIFNOX0VORAkJMjU1CS8qIGVuZCBvZiBzZWN0aW9ucyAqLwogCiAjZGVmaW5lIFNORl9SRVFVSVJFRAkxCS8qIDxzZWN0aW9uZmxhZ3M+OiByZXF1aXJlZCBzZWN0aW9uICovCkBAIC00NjMsNiArNTM4LDE3IEBACiAvKiBmaWxlIHVzZWQgZm9yICJ6RyIgYW5kICJ6VyIgKi8KIHN0YXRpYyBjaGFyX3UJKmludF93b3JkbGlzdCA9IE5VTEw7CiAKK3R5cGVkZWYgc3RydWN0IHdvcmRjb3VudF9TCit7CisgICAgc2hvcnRfdQl3Y19jb3VudDsJICAgIC8qIG5yIG9mIHRpbWVzIHdvcmQgd2FzIHNlZW4gKi8KKyAgICBjaGFyX3UJd2Nfd29yZFsxXTsJICAgIC8qIHdvcmQsIGFjdHVhbGx5IGxvbmdlciAqLworfSB3b3JkY291bnRfVDsKKworc3RhdGljIHdvcmRjb3VudF9UIGR1bXdjOworI2RlZmluZSBXQ19LRVlfT0ZGICAoZHVtd2Mud2Nfd29yZCAtIChjaGFyX3UgKikmZHVtd2MpCisjZGVmaW5lIEhJMldDKGhpKSAgICAgKCh3b3JkY291bnRfVCAqKSgoaGkpLT5oaV9rZXkgLSBXQ19LRVlfT0ZGKSkKKyNkZWZpbmUgTUFYV09SRENPVU5UIDB4ZmZmZgorCiAvKgogICogSW5mb3JtYXRpb24gdXNlZCB3aGVuIGxvb2tpbmcgZm9yIHN1Z2dlc3Rpb25zLgogICovCkBAIC00NzEsNiArNTU3LDcgQEAKICAgICBnYXJyYXlfVAlzdV9nYTsJCSAgICAvKiBzdWdnZXN0aW9ucywgY29udGFpbnMgInN1Z2dlc3RfVCIgKi8KICAgICBpbnQJCXN1X21heGNvdW50OwkgICAgLyogbWF4LiBudW1iZXIgb2Ygc3VnZ2VzdGlvbnMgZGlzcGxheWVkICovCiAgICAgaW50CQlzdV9tYXhzY29yZTsJICAgIC8qIG1heGltdW0gc2NvcmUgZm9yIGFkZGluZyB0byBzdV9nYSAqLworICAgIGludAkJc3Vfc2ZtYXhzY29yZTsJICAgIC8qIGlkZW0sIGZvciB3aGVuIGRvaW5nIHNvdW5kZm9sZCB3b3JkcyAqLwogICAgIGdhcnJheV9UCXN1X3NnYTsJCSAgICAvKiBsaWtlIHN1X2dhLCBzb3VuZC1mb2xkZWQgc2NvcmluZyAqLwogICAgIGNoYXJfdQkqc3VfYmFkcHRyOwkgICAgLyogc3RhcnQgb2YgYmFkIHdvcmQgaW4gbGluZSAqLwogICAgIGludAkJc3VfYmFkbGVuOwkgICAgLyogbGVuZ3RoIG9mIGRldGVjdGVkIGJhZCB3b3JkIGluIGxpbmUgKi8KQEAgLTQ3OCw3ICs1NjUsNiBAQAogICAgIGNoYXJfdQlzdV9iYWR3b3JkW01BWFdMRU5dOyAvKiBiYWQgd29yZCB0cnVuY2F0ZWQgYXQgc3VfYmFkbGVuICovCiAgICAgY2hhcl91CXN1X2ZiYWR3b3JkW01BWFdMRU5dOyAvKiBzdV9iYWR3b3JkIGNhc2UtZm9sZGVkICovCiAgICAgY2hhcl91CXN1X3NhbF9iYWR3b3JkW01BWFdMRU5dOyAvKiBzdV9iYWR3b3JkIHNvdW5kZm9sZGVkICovCi0gICAgc2xhbmdfVAkqc3Vfc2xhbmdfZmlyc3Q7ICAgIC8qIHNsYW5nX1QgdXNlZCBmb3Igc3Vfc2FsX2JhZHdvcmQgKi8KICAgICBoYXNodGFiX1QJc3VfYmFubmVkOwkgICAgLyogdGFibGUgd2l0aCBiYW5uZWQgd29yZHMgKi8KICAgICBzbGFuZ19UCSpzdV9zYWxsYW5nOwkgICAgLyogZGVmYXVsdCBsYW5ndWFnZSBmb3Igc291bmQgZm9sZGluZyAqLwogfSBzdWdpbmZvX1Q7CkBAIC00ODcsNiArNTczLDcgQEAKIHR5cGVkZWYgc3RydWN0IHN1Z2dlc3RfUwogewogICAgIGNoYXJfdQkqc3Rfd29yZDsJLyogc3VnZ2VzdGVkIHdvcmQsIGFsbG9jYXRlZCBzdHJpbmcgKi8KKyAgICBpbnQJCXN0X3dvcmRsZW47CS8qIFNUUkxFTihzdF93b3JkKSAqLwogICAgIGludAkJc3Rfb3JnbGVuOwkvKiBsZW5ndGggb2YgcmVwbGFjZWQgdGV4dCAqLwogICAgIGludAkJc3Rfc2NvcmU7CS8qIGxvd2VyIGlzIGJldHRlciAqLwogICAgIGludAkJc3RfYWx0c2NvcmU7CS8qIHVzZWQgd2hlbiBzdF9zY29yZSBjb21wYXJlcyBlcXVhbCAqLwpAQCAtNDk3LDIxICs1ODQsMjQgQEAKIAogI2RlZmluZSBTVUcoZ2EsIGkpICgoKHN1Z2dlc3RfVCAqKShnYSkuZ2FfZGF0YSlbaV0pCiAKLS8qIE51bWJlciBvZiBzdWdnZXN0aW9ucyBrZXB0IHdoZW4gY2xlYW5pbmcgdXAuICBXaGVuIHJlc2NvcmVfc3VnZ2VzdGlvbnMoKSBpcwotICogY2FsbGVkIHRoZSBzY29yZSBtYXkgY2hhbmdlLCB0aHVzIHdlIG5lZWQgdG8ga2VlcCBtb3JlIHRoYW4gd2hhdCBpcwotICogZGlzcGxheWVkLiAqLwotI2RlZmluZSBTVUdfQ0xFQU5fQ09VTlQoc3UpICAgICgoc3UpLT5zdV9tYXhjb3VudCA8IDUwID8gNTAgOiAoc3UpLT5zdV9tYXhjb3VudCkKKy8qIFRSVUUgaWYgYSB3b3JkIGFwcGVhcnMgaW4gdGhlIGxpc3Qgb2YgYmFubmVkIHdvcmRzLiAgKi8KKyNkZWZpbmUgV0FTX0JBTk5FRChzdSwgd29yZCkgKCFIQVNISVRFTV9FTVBUWShoYXNoX2ZpbmQoJnN1LT5zdV9iYW5uZWQsIHdvcmQpKSkKKworLyogTnVtYmVyIG9mIHN1Z2dlc3Rpb25zIGtlcHQgd2hlbiBjbGVhbmluZyB1cC4gIHdlIG5lZWQgdG8ga2VlcCBtb3JlIHRoYW4KKyAqIHdoYXQgaXMgZGlzcGxheWVkLCBiZWNhdXNlIHdoZW4gcmVzY29yZV9zdWdnZXN0aW9ucygpIGlzIGNhbGxlZCB0aGUgc2NvcmUKKyAqIG1heSBjaGFuZ2UgYW5kIHdyb25nIHN1Z2dlc3Rpb25zIG1heSBiZSByZW1vdmVkIGxhdGVyLiAqLworI2RlZmluZSBTVUdfQ0xFQU5fQ09VTlQoc3UpICAgICgoc3UpLT5zdV9tYXhjb3VudCA8IDEzMCA/IDE1MCA6IChzdSktPnN1X21heGNvdW50ICsgMjApCiAKIC8qIFRocmVzaG9sZCBmb3Igc29ydGluZyBhbmQgY2xlYW5pbmcgdXAgc3VnZ2VzdGlvbnMuICBEb24ndCB3YW50IHRvIGtlZXAgbG90cwogICogb2Ygc3VnZ2VzdGlvbnMgdGhhdCBhcmUgbm90IGdvaW5nIHRvIGJlIGRpc3BsYXllZC4gKi8KLSNkZWZpbmUgU1VHX01BWF9DT1VOVChzdSkgICAgKChzdSktPnN1X21heGNvdW50ICsgNTApCisjZGVmaW5lIFNVR19NQVhfQ09VTlQoc3UpCShTVUdfQ0xFQU5fQ09VTlQoc3UpICsgNTApCiAKIC8qIHNjb3JlIGZvciB2YXJpb3VzIGNoYW5nZXMgKi8KICNkZWZpbmUgU0NPUkVfU1BMSVQJMTQ5CS8qIHNwbGl0IGJhZCB3b3JkICovCiAjZGVmaW5lIFNDT1JFX0lDQVNFCTUyCS8qIHNsaWdodGx5IGRpZmZlcmVudCBjYXNlICovCiAjZGVmaW5lIFNDT1JFX1JFR0lPTgkyMDAJLyogd29yZCBpcyBmb3IgZGlmZmVyZW50IHJlZ2lvbiAqLwogI2RlZmluZSBTQ09SRV9SQVJFCTE4MAkvKiByYXJlIHdvcmQgKi8KLSNkZWZpbmUgU0NPUkVfU1dBUAk5MAkvKiBzd2FwIHR3byBjaGFyYWN0ZXJzICovCisjZGVmaW5lIFNDT1JFX1NXQVAJNzUJLyogc3dhcCB0d28gY2hhcmFjdGVycyAqLwogI2RlZmluZSBTQ09SRV9TV0FQMwkxMTAJLyogc3dhcCB0d28gY2hhcmFjdGVycyBpbiB0aHJlZSAqLwogI2RlZmluZSBTQ09SRV9SRVAJNjUJLyogUkVQIHJlcGxhY2VtZW50ICovCiAjZGVmaW5lIFNDT1JFX1NVQlNUCTkzCS8qIHN1YnN0aXR1dGUgYSBjaGFyYWN0ZXIgKi8KQEAgLTUyOSw4ICs2MTksMjcgQEAKICNkZWZpbmUgU0NPUkVfTUFYSU5JVAkzNTAJLyogSW5pdGlhbCBtYXhpbXVtIHNjb3JlOiBoaWdoZXIgPT0gc2xvd2VyLgogCQkJCSAqIDM1MCBhbGxvd3MgZm9yIGFib3V0IHRocmVlIGNoYW5nZXMuICovCiAKKyNkZWZpbmUgU0NPUkVfQ09NTU9OMQkzMAkvKiBzdWJ0cmFjdGVkIGZvciB3b3JkcyBzZWVuIGJlZm9yZSAqLworI2RlZmluZSBTQ09SRV9DT01NT04yCTQwCS8qIHN1YnRyYWN0ZWQgZm9yIHdvcmRzIG9mdGVuIHNlZW4gKi8KKyNkZWZpbmUgU0NPUkVfQ09NTU9OMwk1MAkvKiBzdWJ0cmFjdGVkIGZvciB3b3JkcyB2ZXJ5IG9mdGVuIHNlZW4gKi8KKyNkZWZpbmUgU0NPUkVfVEhSRVMyCTEwCS8qIHdvcmQgY291bnQgdGhyZXNob2xkIGZvciBDT01NT04yICovCisjZGVmaW5lIFNDT1JFX1RIUkVTMwkxMDAJLyogd29yZCBjb3VudCB0aHJlc2hvbGQgZm9yIENPTU1PTjMgKi8KKworLyogV2hlbiB0cnlpbmcgY2hhbmdlZCBzb3VuZGZvbGQgd29yZHMgaXQgYmVjb21lcyBzbG93IHdoZW4gdHJ5aW5nIG1vcmUgdGhhbgorICogdHdvIGNoYW5nZXMuICBXaXRoIGxlc3MgdGhlbiB0d28gY2hhbmdlcyBpdCdzIHNsaWdodGx5IGZhc3RlciBidXQgd2UgbWlzcyBhCisgKiBmZXcgZ29vZCBzdWdnZXN0aW9ucy4gIEluIHJhcmUgY2FzZXMgd2UgbmVlZCB0byB0cnkgdGhyZWUgb2YgZm91ciBjaGFuZ2VzLgorICovCisjZGVmaW5lIFNDT1JFX1NGTUFYMQkyMDAJLyogbWF4aW11bSBzY29yZSBmb3IgZmlyc3QgdHJ5ICovCisjZGVmaW5lIFNDT1JFX1NGTUFYMgkzMDAJLyogbWF4aW11bSBzY29yZSBmb3Igc2Vjb25kIHRyeSAqLworI2RlZmluZSBTQ09SRV9TRk1BWDMJNDAwCS8qIG1heGltdW0gc2NvcmUgZm9yIHRoaXJkIHRyeSAqLworCiAjZGVmaW5lIFNDT1JFX0JJRwlTQ09SRV9JTlMgKiAzCS8qIGJpZyBkaWZmZXJlbmNlICovCi0jZGVmaW5lIFNDT1JFX01BWE1BWAk5OTk5OTkJLyogYWNjZXB0IGFueSBzY29yZSAqLworI2RlZmluZSBTQ09SRV9NQVhNQVgJOTk5OTk5CQkvKiBhY2NlcHQgYW55IHNjb3JlICovCisjZGVmaW5lIFNDT1JFX0xJTUlUTUFYCTM1MAkJLyogZm9yIHNwZWxsX2VkaXRfc2NvcmVfbGltaXQoKSAqLworCisvKiBmb3Igc3BlbGxfZWRpdF9zY29yZV9saW1pdCgpIHdlIG5lZWQgdG8ga25vdyB0aGUgbWluaW11bSB2YWx1ZSBvZgorICogU0NPUkVfSUNBU0UsIFNDT1JFX1NXQVAsIFNDT1JFX0RFTCwgU0NPUkVfU0lNSUxBUiBhbmQgU0NPUkVfSU5TICovCisjZGVmaW5lIFNDT1JFX0VESVRfTUlOCVNDT1JFX1NJTUlMQVIKIAogLyoKICAqIFN0cnVjdHVyZSB0byBzdG9yZSBpbmZvIGZvciB3b3JkIG1hdGNoaW5nLgpAQCAtNjE3LDYgKzcyNiw3IEBACiAgICAgU1RBVEVfRU5ETlVMLAkvKiBQYXN0IE5VTCBieXRlcyBhdCBzdGFydCBvZiB0aGUgbm9kZS4gKi8KICAgICBTVEFURV9QTEFJTiwJLyogVXNlIGVhY2ggYnl0ZSBvZiB0aGUgbm9kZS4gKi8KICAgICBTVEFURV9ERUwsCQkvKiBEZWxldGUgYSBieXRlIGZyb20gdGhlIGJhZCB3b3JkLiAqLworICAgIFNUQVRFX0lOU19QUkVQLAkvKiBQcmVwYXJlIGZvciBpbnNlcnRpbmcgYnl0ZXMuICovCiAgICAgU1RBVEVfSU5TLAkJLyogSW5zZXJ0IGEgYnl0ZSBpbiB0aGUgYmFkIHdvcmQuICovCiAgICAgU1RBVEVfU1dBUCwJCS8qIFN3YXAgdHdvIGJ5dGVzLiAqLwogICAgIFNUQVRFX1VOU1dBUCwJLyogVW5kbyBzd2FwIHR3byBjaGFyYWN0ZXJzLiAqLwpAQCAtNjU3LDYgKzc2Nyw4IEBACiAgICAgY2hhcl91CXRzX2NvbXBsZW47CS8qIG5yIG9mIGNvbXBvdW5kIHdvcmRzIHVzZWQgKi8KICAgICBjaGFyX3UJdHNfY29tcHNwbGl0OwkvKiBpbmRleCBmb3IgImNvbXBmbGFncyIgd2hlcmUgd29yZCB3YXMgc3BpdCAqLwogICAgIGNoYXJfdQl0c19zYXZlX2JhZGZsYWdzOyAgIC8qIHN1X2JhZGZsYWdzIHNhdmVkIGhlcmUgKi8KKyAgICBjaGFyX3UJdHNfZGVsaWR4OwkvKiBpbmRleCBpbiBmd29yZCBmb3IgY2hhciB0aGF0IHdhcyBkZWxldGVkLAorCQkJCSAgIHZhbGlkIHdoZW4gInRzX2ZsYWdzIiBoYXMgVFNGX0RJRERFTCAqLwogfSB0cnlzdGF0ZV9UOwogCiAvKiB2YWx1ZXMgZm9yIHRzX2lzZGlmZiAqLwpAQCAtNjY3LDExICs3NzksMTIgQEAKIC8qIHZhbHVlcyBmb3IgdHNfZmxhZ3MgKi8KICNkZWZpbmUgVFNGX1BSRUZJWE9LCTEJLyogYWxyZWFkeSBjaGVja2VkIHRoYXQgcHJlZml4IGlzIE9LICovCiAjZGVmaW5lIFRTRl9ESURTUExJVAkyCS8qIHRyaWVkIHNwbGl0IGF0IHRoaXMgcG9pbnQgKi8KKyNkZWZpbmUgVFNGX0RJRERFTAk0CS8qIGRpZCBhIGRlbGV0ZSwgInRzX2RlbGlkeCIgaGFzIGluZGV4ICovCiAKIC8qIHNwZWNpYWwgdmFsdWVzIHRzX3ByZWZpeGRlcHRoICovCiAjZGVmaW5lIFBGRF9OT1BSRUZJWAkweGZmCS8qIG5vdCB1c2luZyBwcmVmaXhlcyAqLwogI2RlZmluZSBQRkRfUFJFRklYVFJFRQkweGZlCS8qIHdhbGtpbmcgdGhyb3VnaCB0aGUgcHJlZml4IHRyZWUgKi8KLSNkZWZpbmUgUEZEX05PVFNQRUNJQUwJMHhmZAkvKiBmaXJzdCB2YWx1ZSB0aGF0J3Mgbm90IHNwZWNpYWwgKi8KKyNkZWZpbmUgUEZEX05PVFNQRUNJQUwJMHhmZAkvKiBoaWdoZXN0IHZhbHVlIHRoYXQncyBub3Qgc3BlY2lhbCAqLwogCiAvKiBtb2RlIHZhbHVlcyBmb3IgZmluZF93b3JkICovCiAjZGVmaW5lIEZJTkRfRk9MRFdPUkQJICAgIDAJLyogZmluZCB3b3JkIGNhc2UtZm9sZGVkICovCkBAIC02ODMsNiArNzk2LDcgQEAKIHN0YXRpYyBzbGFuZ19UICpzbGFuZ19hbGxvYyBfX0FSR1MoKGNoYXJfdSAqbGFuZykpOwogc3RhdGljIHZvaWQgc2xhbmdfZnJlZSBfX0FSR1MoKHNsYW5nX1QgKmxwKSk7CiBzdGF0aWMgdm9pZCBzbGFuZ19jbGVhciBfX0FSR1MoKHNsYW5nX1QgKmxwKSk7CitzdGF0aWMgdm9pZCBzbGFuZ19jbGVhcl9zdWcgX19BUkdTKChzbGFuZ19UICpscCkpOwogc3RhdGljIHZvaWQgZmluZF93b3JkIF9fQVJHUygobWF0Y2hpbmZfVCAqbWlwLCBpbnQgbW9kZSkpOwogc3RhdGljIGludCBjYW5fY29tcG91bmQgX19BUkdTKChzbGFuZ19UICpzbGFuZywgY2hhcl91ICp3b3JkLCBjaGFyX3UgKmZsYWdzKSk7CiBzdGF0aWMgaW50IHZhbGlkX3dvcmRfcHJlZml4IF9fQVJHUygoaW50IHRvdHByZWZjbnQsIGludCBhcnJpZHgsIGludCBmbGFncywgY2hhcl91ICp3b3JkLCBzbGFuZ19UICpzbGFuZywgaW50IGNvbmRfcmVxKSk7CkBAIC03MDAsOCArODE0LDExIEBACiBzdGF0aWMgaW50IHJlYWRfcmVnaW9uX3NlY3Rpb24gX19BUkdTKChGSUxFICpmZCwgc2xhbmdfVCAqc2xhbmcsIGludCBsZW4pKTsKIHN0YXRpYyBpbnQgcmVhZF9jaGFyZmxhZ3Nfc2VjdGlvbiBfX0FSR1MoKEZJTEUgKmZkKSk7CiBzdGF0aWMgaW50IHJlYWRfcHJlZmNvbmRfc2VjdGlvbiBfX0FSR1MoKEZJTEUgKmZkLCBzbGFuZ19UICpscCkpOwotc3RhdGljIGludCByZWFkX3JlcF9zZWN0aW9uIF9fQVJHUygoRklMRSAqZmQsIHNsYW5nX1QgKnNsYW5nKSk7CitzdGF0aWMgaW50IHJlYWRfcmVwX3NlY3Rpb24gX19BUkdTKChGSUxFICpmZCwgZ2FycmF5X1QgKmdhcCwgc2hvcnQgKmZpcnN0KSk7CiBzdGF0aWMgaW50IHJlYWRfc2FsX3NlY3Rpb24gX19BUkdTKChGSUxFICpmZCwgc2xhbmdfVCAqc2xhbmcpKTsKK3N0YXRpYyBpbnQgcmVhZF93b3Jkc19zZWN0aW9uIF9fQVJHUygoRklMRSAqZmQsIHNsYW5nX1QgKmxwLCBpbnQgbGVuKSk7CitzdGF0aWMgdm9pZCBjb3VudF9jb21tb25fd29yZCBfX0FSR1MoKHNsYW5nX1QgKmxwLCBjaGFyX3UgKndvcmQsIGludCBsZW4sIGludCBjb3VudCkpOworc3RhdGljIGludCBzY29yZV93b3JkY291bnRfYWRqIF9fQVJHUygoc2xhbmdfVCAqc2xhbmcsIGludCBzY29yZSwgY2hhcl91ICp3b3JkLCBpbnQgc3BsaXQpKTsKIHN0YXRpYyBpbnQgcmVhZF9zb2ZvX3NlY3Rpb24gX19BUkdTKChGSUxFICpmZCwgc2xhbmdfVCAqc2xhbmcpKTsKIHN0YXRpYyBpbnQgcmVhZF9jb21wb3VuZCBfX0FSR1MoKEZJTEUgKmZkLCBzbGFuZ19UICpzbGFuZywgaW50IGxlbikpOwogc3RhdGljIGludCBieXRlX2luX3N0ciBfX0FSR1MoKGNoYXJfdSAqc3RyLCBpbnQgYnl0ZSkpOwpAQCAtNzEyLDcgKzgyOSw4IEBACiAjaWZkZWYgRkVBVF9NQllURQogc3RhdGljIGludCAqbWJfc3RyMndpZGUgX19BUkdTKChjaGFyX3UgKnMpKTsKICNlbmRpZgotc3RhdGljIGlkeF9UIHJlYWRfdHJlZSBfX0FSR1MoKEZJTEUgKmZkLCBjaGFyX3UgKmJ5dHMsIGlkeF9UICppZHhzLCBpbnQgbWF4aWR4LCBpbnQgc3RhcnRpZHgsIGludCBwcmVmaXh0cmVlLCBpbnQgbWF4cHJlZmNvbmRucikpOworc3RhdGljIGludCBzcGVsbF9yZWFkX3RyZWUgX19BUkdTKChGSUxFICpmZCwgY2hhcl91ICoqYnl0c3AsIGlkeF9UICoqaWR4c3AsIGludCBwcmVmaXh0cmVlLCBpbnQgcHJlZml4Y250KSk7CitzdGF0aWMgaWR4X1QgcmVhZF90cmVlX25vZGUgX19BUkdTKChGSUxFICpmZCwgY2hhcl91ICpieXRzLCBpZHhfVCAqaWR4cywgaW50IG1heGlkeCwgaW50IHN0YXJ0aWR4LCBpbnQgcHJlZml4dHJlZSwgaW50IG1heHByZWZjb25kbnIpKTsKIHN0YXRpYyB2b2lkIGNsZWFyX21pZHdvcmQgX19BUkdTKChidWZfVCAqYnVmKSk7CiBzdGF0aWMgdm9pZCB1c2VfbWlkd29yZCBfX0FSR1MoKHNsYW5nX1QgKmxwLCBidWZfVCAqYnVmKSk7CiBzdGF0aWMgaW50IGZpbmRfcmVnaW9uIF9fQVJHUygoY2hhcl91ICpycCwgY2hhcl91ICpyZWdpb24pKTsKQEAgLTcyMywxOCArODQxLDIxIEBACiBzdGF0aWMgaW50IHNldF9zcGVsbF9jaGFydGFiIF9fQVJHUygoY2hhcl91ICpmb2wsIGNoYXJfdSAqbG93LCBjaGFyX3UgKnVwcCkpOwogc3RhdGljIGludCBzcGVsbF9jYXNlZm9sZCBfX0FSR1MoKGNoYXJfdSAqcCwgaW50IGxlbiwgY2hhcl91ICpidWYsIGludCBidWZsZW4pKTsKIHN0YXRpYyBpbnQgY2hlY2tfbmVlZF9jYXAgX19BUkdTKChsaW5lbnJfVCBsbnVtLCBjb2xucl9UIGNvbCkpOwotc3RhdGljIHZvaWQgc3BlbGxfZmluZF9zdWdnZXN0IF9fQVJHUygoY2hhcl91ICpiYWRwdHIsIHN1Z2luZm9fVCAqc3UsIGludCBtYXhjb3VudCwgaW50IGJhbmJhZHdvcmQsIGludCBuZWVkX2NhcCkpOworc3RhdGljIHZvaWQgc3BlbGxfZmluZF9zdWdnZXN0IF9fQVJHUygoY2hhcl91ICpiYWRwdHIsIHN1Z2luZm9fVCAqc3UsIGludCBtYXhjb3VudCwgaW50IGJhbmJhZHdvcmQsIGludCBuZWVkX2NhcCwgaW50IGludGVyYWN0aXZlKSk7CiAjaWZkZWYgRkVBVF9FVkFMCiBzdGF0aWMgdm9pZCBzcGVsbF9zdWdnZXN0X2V4cHIgX19BUkdTKChzdWdpbmZvX1QgKnN1LCBjaGFyX3UgKmV4cHIpKTsKICNlbmRpZgogc3RhdGljIHZvaWQgc3BlbGxfc3VnZ2VzdF9maWxlIF9fQVJHUygoc3VnaW5mb19UICpzdSwgY2hhcl91ICpmbmFtZSkpOwotc3RhdGljIHZvaWQgc3BlbGxfc3VnZ2VzdF9pbnRlcm4gX19BUkdTKChzdWdpbmZvX1QgKnN1KSk7CitzdGF0aWMgdm9pZCBzcGVsbF9zdWdnZXN0X2ludGVybiBfX0FSR1MoKHN1Z2luZm9fVCAqc3UsIGludCBpbnRlcmFjdGl2ZSkpOworc3RhdGljIHZvaWQgc3VnZ2VzdF9sb2FkX2ZpbGVzIF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQgdHJlZV9jb3VudF93b3JkcyBfX0FSR1MoKGNoYXJfdSAqYnl0cywgaWR4X1QgKmlkeHMpKTsKIHN0YXRpYyB2b2lkIHNwZWxsX2ZpbmRfY2xlYW51cCBfX0FSR1MoKHN1Z2luZm9fVCAqc3UpKTsKIHN0YXRpYyB2b2lkIG9uZWNhcF9jb3B5IF9fQVJHUygoY2hhcl91ICp3b3JkLCBjaGFyX3UgKndjb3B5LCBpbnQgdXBwZXIpKTsKIHN0YXRpYyB2b2lkIGFsbGNhcF9jb3B5IF9fQVJHUygoY2hhcl91ICp3b3JkLCBjaGFyX3UgKndjb3B5KSk7CiBzdGF0aWMgdm9pZCBzdWdnZXN0X3RyeV9zcGVjaWFsIF9fQVJHUygoc3VnaW5mb19UICpzdSkpOwogc3RhdGljIHZvaWQgc3VnZ2VzdF90cnlfY2hhbmdlIF9fQVJHUygoc3VnaW5mb19UICpzdSkpOwotc3RhdGljIGludCB0cnlfZGVlcGVyIF9fQVJHUygoc3VnaW5mb19UICpzdSwgdHJ5c3RhdGVfVCAqc3RhY2ssIGludCBkZXB0aCwgaW50IHNjb3JlX2FkZCkpOworc3RhdGljIHZvaWQgc3VnZ2VzdF90cmllX3dhbGsgX19BUkdTKChzdWdpbmZvX1QgKnN1LCBsYW5ncF9UICpscCwgY2hhcl91ICpmd29yZCwgaW50IHNvdW5kZm9sZCkpOworc3RhdGljIHZvaWQgZ29fZGVlcGVyIF9fQVJHUygodHJ5c3RhdGVfVCAqc3RhY2ssIGludCBkZXB0aCwgaW50IHNjb3JlX2FkZCkpOwogI2lmZGVmIEZFQVRfTUJZVEUKIHN0YXRpYyBpbnQgbm9mb2xkX2xlbiBfX0FSR1MoKGNoYXJfdSAqZndvcmQsIGludCBmbGVuLCBjaGFyX3UgKndvcmQpKTsKICNlbmRpZgpAQCAtNzQyLDE0ICs4NjMsMTcgQEAKIHN0YXRpYyB2b2lkIHNjb3JlX2NvbXBfc2FsIF9fQVJHUygoc3VnaW5mb19UICpzdSkpOwogc3RhdGljIHZvaWQgc2NvcmVfY29tYmluZSBfX0FSR1MoKHN1Z2luZm9fVCAqc3UpKTsKIHN0YXRpYyBpbnQgc3RwX3NhbF9zY29yZSBfX0FSR1MoKHN1Z2dlc3RfVCAqc3RwLCBzdWdpbmZvX1QgKnN1LCBzbGFuZ19UICpzbGFuZywgY2hhcl91ICpiYWRzb3VuZCkpOworc3RhdGljIHZvaWQgc3VnZ2VzdF90cnlfc291bmRhbGlrZV9wcmVwIF9fQVJHUygodm9pZCkpOwogc3RhdGljIHZvaWQgc3VnZ2VzdF90cnlfc291bmRhbGlrZSBfX0FSR1MoKHN1Z2luZm9fVCAqc3UpKTsKK3N0YXRpYyB2b2lkIHN1Z2dlc3RfdHJ5X3NvdW5kYWxpa2VfZmluaXNoIF9fQVJHUygodm9pZCkpOworc3RhdGljIHZvaWQgYWRkX3NvdW5kX3N1Z2dlc3QgX19BUkdTKChzdWdpbmZvX1QgKnN1LCBjaGFyX3UgKmdvb2R3b3JkLCBpbnQgc2NvcmUsIGxhbmdwX1QgKmxwKSk7CitzdGF0aWMgaW50IHNvdW5kZm9sZF9maW5kIF9fQVJHUygoc2xhbmdfVCAqc2xhbmcsIGNoYXJfdSAqd29yZCkpOwogc3RhdGljIHZvaWQgbWFrZV9jYXNlX3dvcmQgX19BUkdTKChjaGFyX3UgKmZ3b3JkLCBjaGFyX3UgKmN3b3JkLCBpbnQgZmxhZ3MpKTsKIHN0YXRpYyB2b2lkIHNldF9tYXBfc3RyIF9fQVJHUygoc2xhbmdfVCAqbHAsIGNoYXJfdSAqbWFwKSk7CiBzdGF0aWMgaW50IHNpbWlsYXJfY2hhcnMgX19BUkdTKChzbGFuZ19UICpzbGFuZywgaW50IGMxLCBpbnQgYzIpKTsKLXN0YXRpYyB2b2lkIGFkZF9zdWdnZXN0aW9uIF9fQVJHUygoc3VnaW5mb19UICpzdSwgZ2FycmF5X1QgKmdhcCwgY2hhcl91ICpnb29kd29yZCwgaW50IGJhZGxlbiwgaW50IHNjb3JlLCBpbnQgYWx0c2NvcmUsIGludCBoYWRfYm9udXMsIHNsYW5nX1QgKnNsYW5nKSk7CitzdGF0aWMgdm9pZCBhZGRfc3VnZ2VzdGlvbiBfX0FSR1MoKHN1Z2luZm9fVCAqc3UsIGdhcnJheV9UICpnYXAsIGNoYXJfdSAqZ29vZHdvcmQsIGludCBiYWRsZW4sIGludCBzY29yZSwgaW50IGFsdHNjb3JlLCBpbnQgaGFkX2JvbnVzLCBzbGFuZ19UICpzbGFuZywgaW50IG1heHNmKSk7CitzdGF0aWMgdm9pZCBjaGVja19zdWdnZXN0aW9ucyBfX0FSR1MoKHN1Z2luZm9fVCAqc3UsIGdhcnJheV9UICpnYXApKTsKIHN0YXRpYyB2b2lkIGFkZF9iYW5uZWQgX19BUkdTKChzdWdpbmZvX1QgKnN1LCBjaGFyX3UgKndvcmQpKTsKLXN0YXRpYyBpbnQgd2FzX2Jhbm5lZCBfX0FSR1MoKHN1Z2luZm9fVCAqc3UsIGNoYXJfdSAqd29yZCkpOwotc3RhdGljIHZvaWQgZnJlZV9iYW5uZWQgX19BUkdTKChzdWdpbmZvX1QgKnN1KSk7CiBzdGF0aWMgdm9pZCByZXNjb3JlX3N1Z2dlc3Rpb25zIF9fQVJHUygoc3VnaW5mb19UICpzdSkpOwogc3RhdGljIHZvaWQgcmVzY29yZV9vbmUgX19BUkdTKChzdWdpbmZvX1QgKnN1LCBzdWdnZXN0X1QgKnN0cCkpOwogc3RhdGljIGludCBjbGVhbnVwX3N1Z2dlc3Rpb25zIF9fQVJHUygoZ2FycmF5X1QgKmdhcCwgaW50IG1heHNjb3JlLCBpbnQga2VlcCkpOwpAQCAtNzYwLDkgKzg4NCwxNSBAQAogc3RhdGljIHZvaWQgc3BlbGxfc291bmRmb2xkX3dzYWwgX19BUkdTKChzbGFuZ19UICpzbGFuZywgY2hhcl91ICppbndvcmQsIGNoYXJfdSAqcmVzKSk7CiAjZW5kaWYKIHN0YXRpYyBpbnQgc291bmRhbGlrZV9zY29yZSBfX0FSR1MoKGNoYXJfdSAqZ29vZHNvdW5kLCBjaGFyX3UgKmJhZHNvdW5kKSk7Ci1zdGF0aWMgaW50IHNwZWxsX2VkaXRfc2NvcmUgX19BUkdTKChjaGFyX3UgKmJhZHdvcmQsIGNoYXJfdSAqZ29vZHdvcmQpKTsKLXN0YXRpYyB2b2lkIGR1bXBfd29yZCBfX0FSR1MoKGNoYXJfdSAqd29yZCwgaW50IHJvdW5kLCBpbnQgZmxhZ3MsIGxpbmVucl9UIGxudW0pKTsKK3N0YXRpYyBpbnQgc3BlbGxfZWRpdF9zY29yZSBfX0FSR1MoKHNsYW5nX1QgKnNsYW5nLCBjaGFyX3UgKmJhZHdvcmQsIGNoYXJfdSAqZ29vZHdvcmQpKTsKK3N0YXRpYyBpbnQgc3BlbGxfZWRpdF9zY29yZV9saW1pdCBfX0FSR1MoKHNsYW5nX1QgKnNsYW5nLCBjaGFyX3UgKmJhZHdvcmQsIGNoYXJfdSAqZ29vZHdvcmQsIGludCBsaW1pdCkpOworI2lmZGVmIEZFQVRfTUJZVEUKK3N0YXRpYyBpbnQgc3BlbGxfZWRpdF9zY29yZV9saW1pdF93IF9fQVJHUygoc2xhbmdfVCAqc2xhbmcsIGNoYXJfdSAqYmFkd29yZCwgY2hhcl91ICpnb29kd29yZCwgaW50IGxpbWl0KSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIGR1bXBfd29yZCBfX0FSR1MoKHNsYW5nX1QgKnNsYW5nLCBjaGFyX3UgKndvcmQsIGludCByb3VuZCwgaW50IGZsYWdzLCBsaW5lbnJfVCBsbnVtKSk7CiBzdGF0aWMgbGluZW5yX1QgZHVtcF9wcmVmaXhlcyBfX0FSR1MoKHNsYW5nX1QgKnNsYW5nLCBjaGFyX3UgKndvcmQsIGludCByb3VuZCwgaW50IGZsYWdzLCBsaW5lbnJfVCBzdGFydGxudW0pKTsKK3N0YXRpYyBidWZfVCAqb3Blbl9zcGVsbGJ1ZiBfX0FSR1MoKHZvaWQpKTsKK3N0YXRpYyB2b2lkIGNsb3NlX3NwZWxsYnVmIF9fQVJHUygoYnVmX1QgKmJ1ZikpOwogCiAvKgogICogVXNlIG91ciBvd24gY2hhcmFjdGVyLWNhc2UgZGVmaW5pdGlvbnMsIGJlY2F1c2UgdGhlIGN1cnJlbnQgbG9jYWxlIG1heQpAQCAtODMxLDExICs5NjEsMTIgQEAKICAqIGNhbGxlciBjYW4gc2tpcCBvdmVyIHRoZSB3b3JkLgogICovCiAgICAgaW50Ci1zcGVsbF9jaGVjayh3cCwgcHRyLCBhdHRycCwgY2FwY29sKQorc3BlbGxfY2hlY2sod3AsIHB0ciwgYXR0cnAsIGNhcGNvbCwgZG9jb3VudCkKICAgICB3aW5fVAkqd3A7CQkvKiBjdXJyZW50IHdpbmRvdyAqLwogICAgIGNoYXJfdQkqcHRyOwogICAgIGhsZl9UCSphdHRycDsKICAgICBpbnQJCSpjYXBjb2w7CS8qIGNvbHVtbiB0byBjaGVjayBmb3IgQ2FwaXRhbCAqLworICAgIGludAkJZG9jb3VudDsJLyogY291bnQgZ29vZCB3b3JkcyAqLwogewogICAgIG1hdGNoaW5mX1QJbWk7CQkvKiBNb3N0IHRoaW5ncyBhcmUgcHV0IGluICJtaSIgc28gdGhhdCBpdCBjYW4KIAkJCQkgICBiZSBwYXNzZWQgdG8gZnVuY3Rpb25zIHF1aWNrbHkuICovCkBAIC04NDMsNiArOTc0LDcgQEAKICAgICBpbnQJCWM7CiAgICAgaW50CQl3cm9uZ2NhcGxlbiA9IDA7CiAgICAgaW50CQlscGk7CisgICAgaW50CQljb3VudF93b3JkID0gZG9jb3VudDsKIAogICAgIC8qIEEgd29yZCBuZXZlciBzdGFydHMgYXQgYSBzcGFjZSBvciBhIGNvbnRyb2wgY2hhcmFjdGVyLiAgUmV0dXJuIHF1aWNrbHkKICAgICAgKiB0aGVuLCBza2lwcGluZyBvdmVyIHRoZSBjaGFyYWN0ZXIuICovCkBAIC05MDUsOCArMTAzNyw4IEBACiAKICAgICAvKgogICAgICAqIExvb3Agb3ZlciB0aGUgbGFuZ3VhZ2VzIHNwZWNpZmllZCBpbiAnc3BlbGxsYW5nJy4KLSAgICAgKiBXZSBjaGVjayB0aGVtIGFsbCwgYmVjYXVzZSBhIG1hdGNoaW5nIHdvcmQgbWF5IGJlIGxvbmdlciB0aGFuIGFuCi0gICAgICogYWxyZWFkeSBmb3VuZCBtYXRjaGluZyB3b3JkLgorICAgICAqIFdlIGNoZWNrIHRoZW0gYWxsLCBiZWNhdXNlIGEgd29yZCBtYXkgYmUgbWF0Y2hlZCBsb25nZXIgaW4gYW5vdGhlcgorICAgICAqIGxhbmd1YWdlLgogICAgICAqLwogICAgIGZvciAobHBpID0gMDsgbHBpIDwgd3AtPndfYnVmZmVyLT5iX2xhbmdwLmdhX2xlbjsgKytscGkpCiAgICAgewpAQCAtOTM0LDYgKzEwNjYsMTQgQEAKIAkgICAgbWkubWlfcmVzdWx0ID0gbWkubWlfcmVzdWx0MjsKIAkgICAgbWkubWlfZW5kID0gbWkubWlfZW5kMjsKIAl9CisKKwkvKiBDb3VudCB0aGUgd29yZCBpbiB0aGUgZmlyc3QgbGFuZ3VhZ2Ugd2hlcmUgaXQncyBmb3VuZCB0byBiZSBPSy4gKi8KKwlpZiAoY291bnRfd29yZCAmJiBtaS5taV9yZXN1bHQgPT0gU1BfT0spCisJeworCSAgICBjb3VudF9jb21tb25fd29yZChtaS5taV9scC0+bHBfc2xhbmcsIHB0ciwKKwkJCQkJCSAgIChpbnQpKG1pLm1pX2VuZCAtIHB0ciksIDEpOworCSAgICBjb3VudF93b3JkID0gRkFMU0U7CisJfQogICAgIH0KIAogICAgIGlmIChtaS5taV9yZXN1bHQgIT0gU1BfT0spCkBAIC0xODk3LDcgKzIwMzcsNyBAQAogCiAJICAgIC8qIHN0YXJ0IG9mIHdvcmQgKi8KIAkgICAgYXR0ciA9IEhMRl9DT1VOVDsKLQkgICAgbGVuID0gc3BlbGxfY2hlY2sod3AsIHAsICZhdHRyLCAmY2FwY29sKTsKKwkgICAgbGVuID0gc3BlbGxfY2hlY2sod3AsIHAsICZhdHRyLCAmY2FwY29sLCBGQUxTRSk7CiAKIAkgICAgaWYgKGF0dHIgIT0gSExGX0NPVU5UKQogCSAgICB7CkBAIC0yMTQwLDcgKzIyODAsNyBAQAogfQogCiAvKgotICogQWxsb2NhdGUgYSBuZXcgc2xhbmdfVC4KKyAqIEFsbG9jYXRlIGEgbmV3IHNsYW5nX1QgZm9yIGxhbmd1YWdlICJsYW5nIi4gICJsYW5nIiBjYW4gYmUgTlVMTC4KICAqIENhbGxlciBtdXN0IGZpbGwgInNsX25leHQiLgogICovCiAgICAgc3RhdGljIHNsYW5nX1QgKgpAQCAtMjE1MiwxMSArMjI5MiwxNSBAQAogICAgIGxwID0gKHNsYW5nX1QgKilhbGxvY19jbGVhcihzaXplb2Yoc2xhbmdfVCkpOwogICAgIGlmIChscCAhPSBOVUxMKQogICAgIHsKLQlscC0+c2xfbmFtZSA9IHZpbV9zdHJzYXZlKGxhbmcpOworCWlmIChsYW5nICE9IE5VTEwpCisJICAgIGxwLT5zbF9uYW1lID0gdmltX3N0cnNhdmUobGFuZyk7CiAJZ2FfaW5pdDIoJmxwLT5zbF9yZXAsIHNpemVvZihmcm9tdG9fVCksIDEwKTsKKwlnYV9pbml0MigmbHAtPnNsX3JlcHNhbCwgc2l6ZW9mKGZyb210b19UKSwgMTApOwogCWxwLT5zbF9jb21wbWF4ID0gTUFYV0xFTjsKIAlscC0+c2xfY29tcHN5bG1heCA9IE1BWFdMRU47CisJaGFzaF9pbml0KCZscC0+c2xfd29yZGNvdW50KTsKICAgICB9CisKICAgICByZXR1cm4gbHA7CiB9CiAKQEAgLTIxODQsNiArMjMyOCw3IEBACiAgICAgZnJvbXRvX1QJKmZ0cDsKICAgICBzYWxpdGVtX1QJKnNtcDsKICAgICBpbnQJCWk7CisgICAgaW50CQlyb3VuZDsKIAogICAgIHZpbV9mcmVlKGxwLT5zbF9mYnl0cyk7CiAgICAgbHAtPnNsX2ZieXRzID0gTlVMTDsKQEAgLTIxOTksMTQgKzIzNDQsMTcgQEAKICAgICB2aW1fZnJlZShscC0+c2xfcGlkeHMpOwogICAgIGxwLT5zbF9waWR4cyA9IE5VTEw7CiAKLSAgICBnYXAgPSAmbHAtPnNsX3JlcDsKLSAgICB3aGlsZSAoZ2FwLT5nYV9sZW4gPiAwKQorICAgIGZvciAocm91bmQgPSAxOyByb3VuZCA8PSAyOyArK3JvdW5kKQogICAgIHsKLQlmdHAgPSAmKChmcm9tdG9fVCAqKWdhcC0+Z2FfZGF0YSlbLS1nYXAtPmdhX2xlbl07Ci0JdmltX2ZyZWUoZnRwLT5mdF9mcm9tKTsKLQl2aW1fZnJlZShmdHAtPmZ0X3RvKTsKKwlnYXAgPSByb3VuZCA9PSAxID8gJmxwLT5zbF9yZXAgOiAmbHAtPnNsX3JlcHNhbDsKKwl3aGlsZSAoZ2FwLT5nYV9sZW4gPiAwKQorCXsKKwkgICAgZnRwID0gJigoZnJvbXRvX1QgKilnYXAtPmdhX2RhdGEpWy0tZ2FwLT5nYV9sZW5dOworCSAgICB2aW1fZnJlZShmdHAtPmZ0X2Zyb20pOworCSAgICB2aW1fZnJlZShmdHAtPmZ0X3RvKTsKKwl9CisJZ2FfY2xlYXIoZ2FwKTsKICAgICB9Ci0gICAgZ2FfY2xlYXIoZ2FwKTsKIAogICAgIGdhcCA9ICZscC0+c2xfc2FsOwogICAgIGlmIChscC0+c2xfc29mbykKQEAgLTIyNTMsMjEgKzI0MDEsMTYgQEAKICAgICBscC0+c2xfc3lsbGFibGUgPSBOVUxMOwogICAgIGdhX2NsZWFyKCZscC0+c2xfc3lsX2l0ZW1zKTsKIAotI2lmZGVmIEZFQVRfTUJZVEUKLSAgICB7Ci0JaW50CSAgICB0b2RvID0gbHAtPnNsX21hcF9oYXNoLmh0X3VzZWQ7Ci0JaGFzaGl0ZW1fVCAgKmhpOworICAgIGhhc2hfY2xlYXJfYWxsKCZscC0+c2xfd29yZGNvdW50LCBXQ19LRVlfT0ZGKTsKKyAgICBoYXNoX2luaXQoJmxwLT5zbF93b3JkY291bnQpOwogCi0JZm9yIChoaSA9IGxwLT5zbF9tYXBfaGFzaC5odF9hcnJheTsgdG9kbyA+IDA7ICsraGkpCi0JICAgIGlmICghSEFTSElURU1fRU1QVFkoaGkpKQotCSAgICB7Ci0JCS0tdG9kbzsKLQkJdmltX2ZyZWUoaGktPmhpX2tleSk7Ci0JICAgIH0KLSAgICB9Ci0gICAgaGFzaF9jbGVhcigmbHAtPnNsX21hcF9oYXNoKTsKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgaGFzaF9jbGVhcl9hbGwoJmxwLT5zbF9tYXBfaGFzaCwgMCk7CiAjZW5kaWYKIAorICAgIC8qIENsZWFyIGluZm8gZnJvbSAuc3VnIGZpbGUuICovCisgICAgc2xhbmdfY2xlYXJfc3VnKGxwKTsKKwogICAgIGxwLT5zbF9jb21wbWF4ID0gTUFYV0xFTjsKICAgICBscC0+c2xfY29tcG1pbmxlbiA9IDA7CiAgICAgbHAtPnNsX2NvbXBzeWxtYXggPSBNQVhXTEVOOwpAQCAtMjI3NSw2ICsyNDE4LDIzIEBACiB9CiAKIC8qCisgKiBDbGVhciB0aGUgaW5mbyBmcm9tIHRoZSAuc3VnIGZpbGUgaW4gImxwIi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzbGFuZ19jbGVhcl9zdWcobHApCisgICAgc2xhbmdfVAkqbHA7Cit7CisgICAgdmltX2ZyZWUobHAtPnNsX3NieXRzKTsKKyAgICBscC0+c2xfc2J5dHMgPSBOVUxMOworICAgIHZpbV9mcmVlKGxwLT5zbF9zaWR4cyk7CisgICAgbHAtPnNsX3NpZHhzID0gTlVMTDsKKyAgICBjbG9zZV9zcGVsbGJ1ZihscC0+c2xfc3VnYnVmKTsKKyAgICBscC0+c2xfc3VnYnVmID0gTlVMTDsKKyAgICBscC0+c2xfc3VnbG9hZGVkID0gRkFMU0U7CisgICAgbHAtPnNsX3N1Z3RpbWUgPSAwOworfQorCisvKgogICogTG9hZCBvbmUgc3BlbGwgZmlsZSBhbmQgc3RvcmUgdGhlIGluZm8gaW50byBhIHNsYW5nX1QuCiAgKiBJbnZva2VkIHRocm91Z2ggZG9faW5fcnVudGltZXBhdGgoKS4KICAqLwpAQCAtMjMwMywxMSArMjQ2MywxMyBAQAogLyoKICAqIExvYWQgb25lIHNwZWxsIGZpbGUgYW5kIHN0b3JlIHRoZSBpbmZvIGludG8gYSBzbGFuZ19ULgogICoKLSAqIFRoaXMgaXMgaW52b2tlZCBpbiB0d28gd2F5czoKKyAqIFRoaXMgaXMgaW52b2tlZCBpbiB0aHJlZSB3YXlzOgogICogLSBGcm9tIHNwZWxsX2xvYWRfY2IoKSB0byBsb2FkIGEgc3BlbGwgZmlsZSBmb3IgdGhlIGZpcnN0IHRpbWUuICAibGFuZyIgaXMKICAqICAgdGhlIGxhbmd1YWdlIG5hbWUsICJvbGRfbHAiIGlzIE5VTEwuICBXaWxsIGFsbG9jYXRlIGFuIHNsYW5nX1QuCiAgKiAtIFRvIHJlbG9hZCBhIHNwZWxsIGZpbGUgdGhhdCB3YXMgY2hhbmdlZC4gICJsYW5nIiBpcyBOVUxMIGFuZCAib2xkX2xwIgogICogICBwb2ludHMgdG8gdGhlIGV4aXN0aW5nIHNsYW5nX1QuCisgKiAtIEp1c3QgYWZ0ZXIgd3JpdGluZyBhIC5zcGwgZmlsZTsgaXQncyByZWFkIGJhY2sgdG8gcHJvZHVjZSB0aGUgLnN1ZyBmaWxlLgorICogICAib2xkX2xwIiBpcyBOVUxMIGFuZCAibGFuZyIgaXMgYSBkdW1teSBuYW1lLiAgV2lsbCBhbGxvY2F0ZSBhbiBzbGFuZ19ULgogICogUmV0dXJucyB0aGUgc2xhbmdfVCB0aGUgc3BlbGwgZmlsZSB3YXMgbG9hZGVkIGludG8uICBOVUxMIGZvciBlcnJvci4KICAqLwogICAgIHN0YXRpYyBzbGFuZ19UICoKQEAgLTIzMjAsMTYgKzI0ODIsMTIgQEAKICAgICBGSUxFCSpmZDsKICAgICBjaGFyX3UJYnVmW1ZJTVNQRUxMTUFHSUNMXTsKICAgICBjaGFyX3UJKnA7Ci0gICAgY2hhcl91CSpicDsKLSAgICBpZHhfVAkqaXA7CiAgICAgaW50CQlpOwogICAgIGludAkJbjsKICAgICBpbnQJCWxlbjsKLSAgICBpbnQJCXJvdW5kOwogICAgIGNoYXJfdQkqc2F2ZV9zb3VyY2luZ19uYW1lID0gc291cmNpbmdfbmFtZTsKICAgICBsaW5lbnJfVAlzYXZlX3NvdXJjaW5nX2xudW0gPSBzb3VyY2luZ19sbnVtOwogICAgIHNsYW5nX1QJKmxwID0gTlVMTDsKLSAgICBpZHhfVAlpZHg7CiAgICAgaW50CQljID0gMDsKICAgICBpbnQJCXJlczsKIApAQCAtMjM3NCw3ICsyNTMyLDggQEAKICAgICBzb3VyY2luZ19uYW1lID0gZm5hbWU7CiAgICAgc291cmNpbmdfbG51bSA9IDA7CiAKLSAgICAvKiA8SEVBREVSPjogPGZpbGVJRD4KKyAgICAvKgorICAgICAqIDxIRUFERVI+OiA8ZmlsZUlEPgogICAgICAqLwogICAgIGZvciAoaSA9IDA7IGkgPCBWSU1TUEVMTE1BR0lDTDsgKytpKQogCWJ1ZltpXSA9IGdldGMoZmQpOwkJCQkvKiA8ZmlsZUlEPiAqLwpAQCAtMjQzMyw3ICsyNTkyLDExIEBACiAJCWJyZWFrOwogCiAJICAgIGNhc2UgU05fUkVQOgotCQlyZXMgPSByZWFkX3JlcF9zZWN0aW9uKGZkLCBscCk7CisJCXJlcyA9IHJlYWRfcmVwX3NlY3Rpb24oZmQsICZscC0+c2xfcmVwLCBscC0+c2xfcmVwX2ZpcnN0KTsKKwkJYnJlYWs7CisKKwkgICAgY2FzZSBTTl9SRVBTQUw6CisJCXJlcyA9IHJlYWRfcmVwX3NlY3Rpb24oZmQsICZscC0+c2xfcmVwc2FsLCBscC0+c2xfcmVwc2FsX2ZpcnN0KTsKIAkJYnJlYWs7CiAKIAkgICAgY2FzZSBTTl9TQUw6CkBAIC0yNDUyLDYgKzI2MTUsMTUgQEAKIAkJdmltX2ZyZWUocCk7CiAJCWJyZWFrOwogCisJICAgIGNhc2UgU05fV09SRFM6CisJCXJlcyA9IHJlYWRfd29yZHNfc2VjdGlvbihmZCwgbHAsIGxlbik7CisJCWJyZWFrOworCisJICAgIGNhc2UgU05fU1VHRklMRToKKwkJZm9yIChpID0gNzsgaSA+PSAwOyAtLWkpCQkvKiA8dGltZXN0YW1wPiAqLworCQkgICAgbHAtPnNsX3N1Z3RpbWUgKz0gZ2V0YyhmZCkgPDwgKGkgKiA4KTsKKwkJYnJlYWs7CisKIAkgICAgY2FzZSBTTl9DT01QT1VORDoKIAkJcmVzID0gcmVhZF9jb21wb3VuZChmZCwgbHAsIGxlbik7CiAJCWJyZWFrOwpAQCAtMjQ4MSw5ICsyNjUzLDkgQEAKIAkJCWdvdG8gdHJ1bmNlcnI7CiAJCWJyZWFrOwogCX0KK3NvbWVlcnJvcjoKIAlpZiAocmVzID09IFNQX0ZPUk1FUlJPUikKIAl7Ci1mb3JtZXJyOgogCSAgICBFTVNHKF8oZV9mb3JtYXQpKTsKIAkgICAgZ290byBlbmRGQUlMOwogCX0KQEAgLTI0OTcsNDggKzI2NjksMjEgQEAKIAkgICAgZ290byBlbmRGQUlMOwogICAgIH0KIAotICAgIC8qIHJvdW5kIDE6IDxMV09SRFRSRUU+Ci0gICAgICogcm91bmQgMjogPEtXT1JEVFJFRT4KLSAgICAgKiByb3VuZCAzOiA8UFJFRklYVFJFRT4gKi8KLSAgICBmb3IgKHJvdW5kID0gMTsgcm91bmQgPD0gMzsgKytyb3VuZCkKLSAgICB7Ci0JLyogVGhlIHRyZWUgc2l6ZSB3YXMgY29tcHV0ZWQgd2hlbiB3cml0aW5nIHRoZSBmaWxlLCBzbyB0aGF0IHdlIGNhbgotCSAqIGFsbG9jYXRlIGl0IGFzIG9uZSBsb25nIGJsb2NrLiA8bm9kZWNvdW50PiAqLwotCWxlbiA9IChnZXRjKGZkKSA8PCAyNCkgKyAoZ2V0YyhmZCkgPDwgMTYpICsgKGdldGMoZmQpIDw8IDgpICsgZ2V0YyhmZCk7Ci0JaWYgKGxlbiA8IDApCi0JICAgIGdvdG8gdHJ1bmNlcnI7Ci0JaWYgKGxlbiA+IDApCi0JewotCSAgICAvKiBBbGxvY2F0ZSB0aGUgYnl0ZSBhcnJheS4gKi8KLQkgICAgYnAgPSBsYWxsb2MoKGxvbmdfdSlsZW4sIFRSVUUpOwotCSAgICBpZiAoYnAgPT0gTlVMTCkKLQkJZ290byBlbmRGQUlMOwotCSAgICBpZiAocm91bmQgPT0gMSkKLQkJbHAtPnNsX2ZieXRzID0gYnA7Ci0JICAgIGVsc2UgaWYgKHJvdW5kID09IDIpCi0JCWxwLT5zbF9rYnl0cyA9IGJwOwotCSAgICBlbHNlCi0JCWxwLT5zbF9wYnl0cyA9IGJwOworICAgIC8qIDxMV09SRFRSRUU+ICovCisgICAgcmVzID0gc3BlbGxfcmVhZF90cmVlKGZkLCAmbHAtPnNsX2ZieXRzLCAmbHAtPnNsX2ZpZHhzLCBGQUxTRSwgMCk7CisgICAgaWYgKHJlcyAhPSAwKQorCWdvdG8gc29tZWVycm9yOwogCi0JICAgIC8qIEFsbG9jYXRlIHRoZSBpbmRleCBhcnJheS4gKi8KLQkgICAgaXAgPSAoaWR4X1QgKilsYWxsb2NfY2xlYXIoKGxvbmdfdSkobGVuICogc2l6ZW9mKGludCkpLCBUUlVFKTsKLQkgICAgaWYgKGlwID09IE5VTEwpCi0JCWdvdG8gZW5kRkFJTDsKLQkgICAgaWYgKHJvdW5kID09IDEpCi0JCWxwLT5zbF9maWR4cyA9IGlwOwotCSAgICBlbHNlIGlmIChyb3VuZCA9PSAyKQotCQlscC0+c2xfa2lkeHMgPSBpcDsKLQkgICAgZWxzZQotCQlscC0+c2xfcGlkeHMgPSBpcDsKKyAgICAvKiA8S1dPUkRUUkVFPiAqLworICAgIHJlcyA9IHNwZWxsX3JlYWRfdHJlZShmZCwgJmxwLT5zbF9rYnl0cywgJmxwLT5zbF9raWR4cywgRkFMU0UsIDApOworICAgIGlmIChyZXMgIT0gMCkKKwlnb3RvIHNvbWVlcnJvcjsKIAotCSAgICAvKiBSZWFkIHRoZSB0cmVlIGFuZCBzdG9yZSBpdCBpbiB0aGUgYXJyYXkuICovCi0JICAgIGlkeCA9IHJlYWRfdHJlZShmZCwgYnAsIGlwLCBsZW4sIDAsIHJvdW5kID09IDMsIGxwLT5zbF9wcmVmaXhjbnQpOwotCSAgICBpZiAoaWR4ID09IC0xKQotCQlnb3RvIHRydW5jZXJyOwotCSAgICBpZiAoaWR4IDwgMCkKLQkJZ290byBmb3JtZXJyOwotCX0KLSAgICB9CisgICAgLyogPFBSRUZJWFRSRUU+ICovCisgICAgcmVzID0gc3BlbGxfcmVhZF90cmVlKGZkLCAmbHAtPnNsX3BieXRzLCAmbHAtPnNsX3BpZHhzLCBUUlVFLAorCQkJCQkJCSAgICBscC0+c2xfcHJlZml4Y250KTsKKyAgICBpZiAocmVzICE9IDApCisJZ290byBzb21lZXJyb3I7CiAKICAgICAvKiBGb3IgYSBuZXcgZmlsZSBsaW5rIGl0IGluIHRoZSBsaXN0IG9mIHNwZWxsIGZpbGVzLiAqLwogICAgIGlmIChvbGRfbHAgPT0gTlVMTCkKQEAgLTI3MzMsMjUgKzI4NzgsMjMgQEAKIH0KIAogLyoKLSAqIFJlYWQgUkVQIGl0ZW1zIHNlY3Rpb24gZnJvbSAiZmQiOiA8cmVwY291bnQ+IDxyZXA+IC4uLgorICogUmVhZCBSRVAgb3IgUkVQU0FMIGl0ZW1zIHNlY3Rpb24gZnJvbSAiZmQiOiA8cmVwY291bnQ+IDxyZXA+IC4uLgogICogUmV0dXJuIFNQXypFUlJPUiBmbGFncy4KICAqLwogICAgIHN0YXRpYyBpbnQKLXJlYWRfcmVwX3NlY3Rpb24oZmQsIHNsYW5nKQorcmVhZF9yZXBfc2VjdGlvbihmZCwgZ2FwLCBmaXJzdCkKICAgICBGSUxFCSpmZDsKLSAgICBzbGFuZ19UCSpzbGFuZzsKKyAgICBnYXJyYXlfVAkqZ2FwOworICAgIHNob3J0CSpmaXJzdDsKIHsKICAgICBpbnQJCWNudDsKLSAgICBnYXJyYXlfVAkqZ2FwOwogICAgIGZyb210b19UCSpmdHA7Ci0gICAgc2hvcnQJKmZpcnN0OwogICAgIGludAkJaTsKIAogICAgIGNudCA9IChnZXRjKGZkKSA8PCA4KSArIGdldGMoZmQpOwkJCS8qIDxyZXBjb3VudD4gKi8KICAgICBpZiAoY250IDwgMCkKIAlyZXR1cm4gU1BfVFJVTkNFUlJPUjsKIAotICAgIGdhcCA9ICZzbGFuZy0+c2xfcmVwOwogICAgIGlmIChnYV9ncm93KGdhcCwgY250KSA9PSBGQUlMKQogCXJldHVybiBTUF9PVEhFUkVSUk9SOwogCkBAIC0yNzc1LDcgKzI5MTgsNiBAQAogICAgIH0KIAogICAgIC8qIEZpbGwgdGhlIGZpcnN0LWluZGV4IHRhYmxlLiAqLwotICAgIGZpcnN0ID0gc2xhbmctPnNsX3JlcF9maXJzdDsKICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpCiAJZmlyc3RbaV0gPSAtMTsKICAgICBmb3IgKGkgPSAwOyBpIDwgZ2FwLT5nYV9sZW47ICsraSkKQEAgLTI5NDEsNiArMzA4MywxMTkgQEAKIH0KIAogLyoKKyAqIFJlYWQgU05fV09SRFM6IDx3b3JkPiAuLi4KKyAqIFJldHVybiBTUF8qRVJST1IgZmxhZ3MuCisgKi8KKyAgICBzdGF0aWMgaW50CityZWFkX3dvcmRzX3NlY3Rpb24oZmQsIGxwLCBsZW4pCisgICAgRklMRQkqZmQ7CisgICAgc2xhbmdfVAkqbHA7CisgICAgaW50CQlsZW47Cit7CisgICAgaW50CQlkb25lID0gMDsKKyAgICBpbnQJCWk7CisgICAgY2hhcl91CXdvcmRbTUFYV0xFTl07CisKKyAgICB3aGlsZSAoZG9uZSA8IGxlbikKKyAgICB7CisJLyogUmVhZCBvbmUgd29yZCBhdCBhIHRpbWUuICovCisJZm9yIChpID0gMDsgOyArK2kpCisJeworCSAgICB3b3JkW2ldID0gZ2V0YyhmZCk7CisJICAgIGlmICh3b3JkW2ldID09IE5VTCkKKwkJYnJlYWs7CisJICAgIGlmIChpID09IE1BWFdMRU4gLSAxKQorCQlyZXR1cm4gU1BfRk9STUVSUk9SOworCX0KKworCS8qIEluaXQgdGhlIGNvdW50IHRvIDEwLiAqLworCWNvdW50X2NvbW1vbl93b3JkKGxwLCB3b3JkLCAtMSwgMTApOworCWRvbmUgKz0gaSArIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKgorICogQWRkIGEgd29yZCB0byB0aGUgaGFzaHRhYmxlIG9mIGNvbW1vbiB3b3Jkcy4KKyAqIElmIGl0J3MgYWxyZWFkeSB0aGVyZSB0aGVuIHRoZSBjb3VudGVyIGlzIGluY3JlYXNlZC4KKyAqLworICAgIHN0YXRpYyB2b2lkCitjb3VudF9jb21tb25fd29yZChscCwgd29yZCwgbGVuLCBjb3VudCkKKyAgICBzbGFuZ19UCSpscDsKKyAgICBjaGFyX3UJKndvcmQ7CisgICAgaW50CQlsZW47CSAgICAvKiB3b3JkIGxlbmd0aCwgLTEgZm9yIHVwdG8gTlVMICovCisgICAgaW50CQljb3VudDsJICAgIC8qIDEgdG8gY291bnQgb25jZSwgMTAgdG8gaW5pdCAqLworeworICAgIGhhc2hfVAloYXNoOworICAgIGhhc2hpdGVtX1QJKmhpOworICAgIHdvcmRjb3VudF9UCSp3YzsKKyAgICBjaGFyX3UJYnVmW01BWFdMRU5dOworICAgIGNoYXJfdQkqcDsKKworICAgIGlmIChsZW4gPT0gLTEpCisJcCA9IHdvcmQ7CisgICAgZWxzZQorICAgIHsKKwl2aW1fc3RybmNweShidWYsIHdvcmQsIGxlbik7CisJcCA9IGJ1ZjsKKyAgICB9CisKKyAgICBoYXNoID0gaGFzaF9oYXNoKHApOworICAgIGhpID0gaGFzaF9sb29rdXAoJmxwLT5zbF93b3JkY291bnQsIHAsIGhhc2gpOworICAgIGlmIChIQVNISVRFTV9FTVBUWShoaSkpCisgICAgeworCXdjID0gKHdvcmRjb3VudF9UICopYWxsb2Moc2l6ZW9mKHdvcmRjb3VudF9UKSArIFNUUkxFTihwKSk7CisJaWYgKHdjID09IE5VTEwpCisJICAgIHJldHVybjsKKwlTVFJDUFkod2MtPndjX3dvcmQsIHApOworCXdjLT53Y19jb3VudCA9IGNvdW50OworCWhhc2hfYWRkX2l0ZW0oJmxwLT5zbF93b3JkY291bnQsIGhpLCB3Yy0+d2Nfd29yZCwgaGFzaCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJd2MgPSBISTJXQyhoaSk7CisJaWYgKCh3Yy0+d2NfY291bnQgKz0gY291bnQpIDwgKHVuc2lnbmVkKWNvdW50KQkvKiBjaGVjayBmb3Igb3ZlcmZsb3cgKi8KKwkgICAgd2MtPndjX2NvdW50ID0gTUFYV09SRENPVU5UOworICAgIH0KK30KKworLyoKKyAqIEFkanVzdCB0aGUgc2NvcmUgb2YgY29tbW9uIHdvcmRzLgorICovCisgICAgc3RhdGljIGludAorc2NvcmVfd29yZGNvdW50X2FkaihzbGFuZywgc2NvcmUsIHdvcmQsIHNwbGl0KQorICAgIHNsYW5nX1QJKnNsYW5nOworICAgIGludAkJc2NvcmU7CisgICAgY2hhcl91CSp3b3JkOworICAgIGludAkJc3BsaXQ7CSAgICAvKiB3b3JkIHdhcyBzcGxpdCwgbGVzcyBib251cyAqLworeworICAgIGhhc2hpdGVtX1QJKmhpOworICAgIHdvcmRjb3VudF9UCSp3YzsKKyAgICBpbnQJCWJvbnVzOworICAgIGludAkJbmV3c2NvcmU7CisKKyAgICBoaSA9IGhhc2hfZmluZCgmc2xhbmctPnNsX3dvcmRjb3VudCwgd29yZCk7CisgICAgaWYgKCFIQVNISVRFTV9FTVBUWShoaSkpCisgICAgeworCXdjID0gSEkyV0MoaGkpOworCWlmICh3Yy0+d2NfY291bnQgPCBTQ09SRV9USFJFUzIpCisJICAgIGJvbnVzID0gU0NPUkVfQ09NTU9OMTsKKwllbHNlIGlmICh3Yy0+d2NfY291bnQgPCBTQ09SRV9USFJFUzMpCisJICAgIGJvbnVzID0gU0NPUkVfQ09NTU9OMjsKKwllbHNlCisJICAgIGJvbnVzID0gU0NPUkVfQ09NTU9OMzsKKwlpZiAoc3BsaXQpCisJICAgIG5ld3Njb3JlID0gc2NvcmUgLSBib251cyAvIDI7CisJZWxzZQorCSAgICBuZXdzY29yZSA9IHNjb3JlIC0gYm9udXM7CisJaWYgKG5ld3Njb3JlIDwgMCkKKwkgICAgcmV0dXJuIDA7CisJcmV0dXJuIG5ld3Njb3JlOworICAgIH0KKyAgICByZXR1cm4gc2NvcmU7Cit9CisKKy8qCiAgKiBTTl9TT0ZPOiA8c29mb2Zyb21sZW4+IDxzb2ZvZnJvbT4gPHNvZm90b2xlbj4gPHNvZm90bz4KICAqIFJldHVybiBTUF8qRVJST1IgZmxhZ3MuCiAgKi8KQEAgLTM0MzQsMTcgKzM2ODksNjMgQEAKICNlbmRpZgogCiAvKgorICogUmVhZCBhIHRyZWUgZnJvbSB0aGUgLnNwbCBvciAuc3VnIGZpbGUuCisgKiBBbGxvY2F0ZXMgdGhlIG1lbW9yeSBhbmQgc3RvcmVzIHBvaW50ZXJzIGluICJieXRzcCIgYW5kICJpZHhzcCIuCisgKiBUaGlzIGlzIHNraXBwZWQgd2hlbiB0aGUgdHJlZSBoYXMgemVybyBsZW5ndGguCisgKiBSZXR1cm5zIHplcm8gd2hlbiBPSywgU1BfIHZhbHVlIGZvciBhbiBlcnJvci4KKyAqLworICAgIHN0YXRpYyBpbnQKK3NwZWxsX3JlYWRfdHJlZShmZCwgYnl0c3AsIGlkeHNwLCBwcmVmaXh0cmVlLCBwcmVmaXhjbnQpCisgICAgRklMRQkqZmQ7CisgICAgY2hhcl91CSoqYnl0c3A7CisgICAgaWR4X1QJKippZHhzcDsKKyAgICBpbnQJCXByZWZpeHRyZWU7CS8qIFRSVUUgZm9yIHRoZSBwcmVmaXggdHJlZSAqLworICAgIGludAkJcHJlZml4Y250OwkvKiB3aGVuICJwcmVmaXh0cmVlIiBpcyBUUlVFOiBwcmVmaXggY291bnQgKi8KK3sKKyAgICBpbnQJCWxlbjsKKyAgICBpbnQJCWlkeDsKKyAgICBjaGFyX3UJKmJwOworICAgIGlkeF9UCSppcDsKKworICAgIC8qIFRoZSB0cmVlIHNpemUgd2FzIGNvbXB1dGVkIHdoZW4gd3JpdGluZyB0aGUgZmlsZSwgc28gdGhhdCB3ZSBjYW4KKyAgICAgKiBhbGxvY2F0ZSBpdCBhcyBvbmUgbG9uZyBibG9jay4gPG5vZGVjb3VudD4gKi8KKyAgICBsZW4gPSAoZ2V0YyhmZCkgPDwgMjQpICsgKGdldGMoZmQpIDw8IDE2KSArIChnZXRjKGZkKSA8PCA4KSArIGdldGMoZmQpOworICAgIGlmIChsZW4gPCAwKQorCXJldHVybiBTUF9UUlVOQ0VSUk9SOworICAgIGlmIChsZW4gPiAwKQorICAgIHsKKwkvKiBBbGxvY2F0ZSB0aGUgYnl0ZSBhcnJheS4gKi8KKwlicCA9IGxhbGxvYygobG9uZ191KWxlbiwgVFJVRSk7CisJaWYgKGJwID09IE5VTEwpCisJICAgIHJldHVybiBTUF9PVEhFUkVSUk9SOworCSpieXRzcCA9IGJwOworCisJLyogQWxsb2NhdGUgdGhlIGluZGV4IGFycmF5LiAqLworCWlwID0gKGlkeF9UICopbGFsbG9jX2NsZWFyKChsb25nX3UpKGxlbiAqIHNpemVvZihpbnQpKSwgVFJVRSk7CisJaWYgKGlwID09IE5VTEwpCisJICAgIHJldHVybiBTUF9PVEhFUkVSUk9SOworCSppZHhzcCA9IGlwOworCisJLyogUmVjdXJzaXZlbHkgcmVhZCB0aGUgdHJlZSBhbmQgc3RvcmUgaXQgaW4gdGhlIGFycmF5LiAqLworCWlkeCA9IHJlYWRfdHJlZV9ub2RlKGZkLCBicCwgaXAsIGxlbiwgMCwgcHJlZml4dHJlZSwgcHJlZml4Y250KTsKKwlpZiAoaWR4IDwgMCkKKwkgICAgcmV0dXJuIGlkeDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCiAgKiBSZWFkIG9uZSByb3cgb2Ygc2libGluZ3MgZnJvbSB0aGUgc3BlbGwgZmlsZSBhbmQgc3RvcmUgaXQgaW4gdGhlIGJ5dGUgYXJyYXkKICAqICJieXRzIiBhbmQgaW5kZXggYXJyYXkgImlkeHMiLiAgUmVjdXJzaXZlbHkgcmVhZCB0aGUgY2hpbGRyZW4uCiAgKgotICogTk9URTogVGhlIGNvZGUgaGVyZSBtdXN0IG1hdGNoIHB1dF9ub2RlKCkuCisgKiBOT1RFOiBUaGUgY29kZSBoZXJlIG11c3QgbWF0Y2ggcHV0X25vZGUoKSEKICAqCi0gKiBSZXR1cm5zIHRoZSBpbmRleCBmb2xsb3NpbmcgdGhlIHNpYmxpbmdzLgotICogUmV0dXJucyAtMSBpZiB0aGUgZmlsZSBpcyBzaG9ydGVyIHRoYW4gZXhwZWN0ZWQuCi0gKiBSZXR1cm5zIC0yIGlmIHRoZXJlIGlzIGEgZm9ybWF0IGVycm9yLgorICogUmV0dXJucyB0aGUgaW5kZXggKD49IDApIGZvbGxvd2luZyB0aGUgc2libGluZ3MuCisgKiBSZXR1cm5zIFNQX1RSVU5DRVJST1IgaWYgdGhlIGZpbGUgaXMgc2hvcnRlciB0aGFuIGV4cGVjdGVkLgorICogUmV0dXJucyBTUF9GT1JNRVJST1IgaWYgdGhlcmUgaXMgYSBmb3JtYXQgZXJyb3IuCiAgKi8KICAgICBzdGF0aWMgaWR4X1QKLXJlYWRfdHJlZShmZCwgYnl0cywgaWR4cywgbWF4aWR4LCBzdGFydGlkeCwgcHJlZml4dHJlZSwgbWF4cHJlZmNvbmRucikKK3JlYWRfdHJlZV9ub2RlKGZkLCBieXRzLCBpZHhzLCBtYXhpZHgsIHN0YXJ0aWR4LCBwcmVmaXh0cmVlLCBtYXhwcmVmY29uZG5yKQogICAgIEZJTEUJKmZkOwogICAgIGNoYXJfdQkqYnl0czsKICAgICBpZHhfVAkqaWR4czsKQEAgLTM0NjMsMTAgKzM3NjQsMTAgQEAKIAogICAgIGxlbiA9IGdldGMoZmQpOwkJCQkJLyogPHNpYmxpbmdjb3VudD4gKi8KICAgICBpZiAobGVuIDw9IDApCi0JcmV0dXJuIC0xOworCXJldHVybiBTUF9UUlVOQ0VSUk9SOwogCiAgICAgaWYgKHN0YXJ0aWR4ICsgbGVuID49IG1heGlkeCkKLQlyZXR1cm4gLTI7CisJcmV0dXJuIFNQX0ZPUk1FUlJPUjsKICAgICBieXRzW2lkeCsrXSA9IGxlbjsKIAogICAgIC8qIFJlYWQgdGhlIGJ5dGUgdmFsdWVzLCBmbGFnL3JlZ2lvbiBieXRlcyBhbmQgc2hhcmVkIGluZGV4ZXMuICovCkBAIC0zNDc0LDcgKzM3NzUsNyBAQAogICAgIHsKIAljID0gZ2V0YyhmZCk7CQkJCQkvKiA8Ynl0ZT4gKi8KIAlpZiAoYyA8IDApCi0JICAgIHJldHVybiAtMTsKKwkgICAgcmV0dXJuIFNQX1RSVU5DRVJST1I7CiAJaWYgKGMgPD0gQllfU1BFQ0lBTCkKIAl7CiAJICAgIGlmIChjID09IEJZX05PRkxBR1MgJiYgIXByZWZpeHRyZWUpCkBAIC0zNTAwLDcgKzM4MDEsNyBAQAogCiAJCSAgICBuID0gKGdldGMoZmQpIDw8IDgpICsgZ2V0YyhmZCk7CS8qIDxwcmVmY29uZG5yPiAqLwogCQkgICAgaWYgKG4gPj0gbWF4cHJlZmNvbmRucikKLQkJCXJldHVybiAtMjsKKwkJCXJldHVybiBTUF9GT1JNRVJST1I7CiAJCSAgICBjIHw9IChuIDw8IDgpOwogCQl9CiAJCWVsc2UgLyogYyBtdXN0IGJlIEJZX0ZMQUdTIG9yIEJZX0ZMQUdTMiAqLwpAQCAtMzUyNiw3ICszODI3LDcgQEAKIAkJCQkJCQkvKiA8bm9kZWlkeD4gKi8KIAkJbiA9IChnZXRjKGZkKSA8PCAxNikgKyAoZ2V0YyhmZCkgPDwgOCkgKyBnZXRjKGZkKTsKIAkJaWYgKG4gPCAwIHx8IG4gPj0gbWF4aWR4KQotCQkgICAgcmV0dXJuIC0yOworCQkgICAgcmV0dXJuIFNQX0ZPUk1FUlJPUjsKIAkJaWR4c1tpZHhdID0gbiArIFNIQVJFRF9NQVNLOwogCQljID0gZ2V0YyhmZCk7CQkJCS8qIDx4Ynl0ZT4gKi8KIAkgICAgfQpAQCAtMzU0NSw3ICszODQ2LDcgQEAKIAkgICAgZWxzZQogCSAgICB7CiAJCWlkeHNbc3RhcnRpZHggKyBpXSA9IGlkeDsKLQkJaWR4ID0gcmVhZF90cmVlKGZkLCBieXRzLCBpZHhzLCBtYXhpZHgsIGlkeCwKKwkJaWR4ID0gcmVhZF90cmVlX25vZGUoZmQsIGJ5dHMsIGlkeHMsIG1heGlkeCwgaWR4LAogCQkJCQkJICAgICBwcmVmaXh0cmVlLCBtYXhwcmVmY29uZG5yKTsKIAkJaWYgKGlkeCA8IDApCiAJCSAgICBicmVhazsKQEAgLTM4MjAsNyArNDEyMSw3IEBACiAJICAgIC8qIGxhbmd1YWdlIGhhcyBSRVAgaXRlbXMgaXRzZWxmICovCiAJICAgIGxwLT5scF9yZXBsYW5nID0gbHAtPmxwX3NsYW5nOwogCWVsc2UKLQkgICAgLyogZmluZCBmaXJzdCBzaW1pbGFyIGxhbmd1YWdlIHRoYXQgZG9lcyBzb3VuZCBmb2xkaW5nICovCisJICAgIC8qIGZpbmQgZmlyc3Qgc2ltaWxhciBsYW5ndWFnZSB0aGF0IGhhcyBSRVAgaXRlbXMgKi8KIAkgICAgZm9yIChqID0gMDsgaiA8IGdhLmdhX2xlbjsgKytqKQogCSAgICB7CiAJCWxwMiA9IExBTkdQX0VOVFJZKGdhLCBqKTsKQEAgLTQyMzksMTEgKzQ1NDAsMTUgQEAKIAkJCQkgICBzaWJsaW5ncywgaW4gZm9sbG93aW5nIHNpYmxpbmdzIGl0IGlzCiAJCQkJICAgYWx3YXlzIG9uZS4gKi8KICAgICBjaGFyX3UJd25fYnl0ZTsJLyogQnl0ZSBmb3IgdGhpcyBub2RlLiBOVUwgZm9yIHdvcmQgZW5kICovCi0gICAgY2hhcl91CXduX2FmZml4SUQ7CS8qIHdoZW4gInduX2J5dGUiIGlzIE5VTDogc3VwcG9ydGVkL3JlcXVpcmVkCi0JCQkJICAgcHJlZml4IElEIG9yIDAgKi8KLSAgICBzaG9ydF91CXduX2ZsYWdzOwkvKiB3aGVuICJ3bl9ieXRlIiBpcyBOVUw6IFdGXyBmbGFncyAqLwotICAgIHNob3J0CXduX3JlZ2lvbjsJLyogd2hlbiAid25fYnl0ZSIgaXMgTlVMOiByZWdpb24gbWFzazsgZm9yCi0JCQkJICAgUFJFRklYVFJFRSBpdCdzIHRoZSBwcmVmY29uZG5yICovCisKKyAgICAvKiBJbmZvIGZvciB3aGVuICJ3bl9ieXRlIiBpcyBOVUwuCisgICAgICogSW4gUFJFRklYVFJFRSAid25fcmVnaW9uIiBpcyB1c2VkIGZvciB0aGUgcHJlZmNvbmRuci4KKyAgICAgKiBJbiB0aGUgc291bmRmb2xkZWQgd29yZCB0cmVlICJ3bl9mbGFncyIgaGFzIHRoZSBNU1cgb2YgdGhlIHdvcmRuciBhbmQKKyAgICAgKiAid25fcmVnaW9uIiB0aGUgTFNXIG9mIHRoZSB3b3JkbnIuICovCisgICAgY2hhcl91CXduX2FmZml4SUQ7CS8qIHN1cHBvcnRlZC9yZXF1aXJlZCBwcmVmaXggSUQgb3IgMCAqLworICAgIHNob3J0X3UJd25fZmxhZ3M7CS8qIFdGXyBmbGFncyAqLworICAgIHNob3J0CXduX3JlZ2lvbjsJLyogcmVnaW9uIG1hc2sgKi8KKwogI2lmZGVmIFNQRUxMX1BSSU5UVFJFRQogICAgIGludAkJd25fbnI7CQkvKiBzZXF1ZW5jZSBuciBmb3IgcHJpbnRpbmcgKi8KICNlbmRpZgpAQCAtNDI2Niw2ICs0NTcxLDggQEAKIAogICAgIHdvcmRub2RlX1QJKnNpX3ByZWZyb290OwkvKiB0cmVlIHdpdGggcG9zdHBvbmVkIHByZWZpeGVzICovCiAKKyAgICBsb25nCXNpX3N1Z3RyZWU7CS8qIGNyZWF0aW5nIHRoZSBzb3VuZGZvbGRpbmcgdHJpZSAqLworCiAgICAgc2Jsb2NrX1QJKnNpX2Jsb2NrczsJLyogbWVtb3J5IGJsb2NrcyB1c2VkICovCiAgICAgbG9uZwlzaV9ibG9ja3NfY250OwkvKiBtZW1vcnkgYmxvY2tzIGFsbG9jYXRlZCAqLwogICAgIGxvbmcJc2lfY29tcHJlc3NfY250OyAgICAvKiB3b3JkcyB0byBhZGQgYmVmb3JlIGxvd2VyaW5nCkBAIC00Mjc2LDcgKzQ1ODMsNyBAQAogI2lmZGVmIFNQRUxMX1BSSU5UVFJFRQogICAgIGludAkJc2lfd29yZG5vZGVfbnI7CS8qIHNlcXVlbmNlIG5yIGZvciBub2RlcyAqLwogI2VuZGlmCi0KKyAgICBidWZfVAkqc2lfc3BlbGxidWY7CS8qIGJ1ZmZlciB1c2VkIHRvIHN0b3JlIHNvdW5kZm9sZCB3b3JkIHRhYmxlICovCiAKICAgICBpbnQJCXNpX2FzY2lpOwkvKiBoYW5kbGluZyBvbmx5IEFTQ0lJIHdvcmRzICovCiAgICAgaW50CQlzaV9hZGQ7CQkvKiBhZGRpdGlvbiBmaWxlICovCkBAIC00MjkyLDExICs0NTk5LDE1IEBACiAJCQkJICAgICAqIHNpX3JlZ2lvbl9jb3VudCA+IDEpICovCiAKICAgICBnYXJyYXlfVAlzaV9yZXA7CQkvKiBsaXN0IG9mIGZyb210b19UIGVudHJpZXMgZnJvbSBSRVAgbGluZXMgKi8KKyAgICBnYXJyYXlfVAlzaV9yZXBzYWw7CS8qIGxpc3Qgb2YgZnJvbXRvX1QgZW50cmllcyBmcm9tIFJFUFNBTCBsaW5lcyAqLwogICAgIGdhcnJheV9UCXNpX3NhbDsJCS8qIGxpc3Qgb2YgZnJvbXRvX1QgZW50cmllcyBmcm9tIFNBTCBsaW5lcyAqLwogICAgIGNoYXJfdQkqc2lfc29mb2ZyOwkvKiBTT0ZPRlJPTSB0ZXh0ICovCiAgICAgY2hhcl91CSpzaV9zb2ZvdG87CS8qIFNPRk9UTyB0ZXh0ICovCisgICAgaW50CQlzaV9ub3N1Z2ZpbGU7CS8qIE5PU1VHRklMRSBpdGVtIGZvdW5kICovCiAgICAgaW50CQlzaV9mb2xsb3d1cDsJLyogc291bmRzYWxpa2U6ID8gKi8KICAgICBpbnQJCXNpX2NvbGxhcHNlOwkvKiBzb3VuZHNhbGlrZTogPyAqLworICAgIGhhc2h0YWJfVAlzaV9jb21tb253b3JkczsJLyogaGFzaHRhYmxlIGZvciBjb21tb24gd29yZHMgKi8KKyAgICB0aW1lX3QJc2lfc3VndGltZTsJLyogdGltZXN0YW1wIGZvciAuc3VnIGZpbGUgKi8KICAgICBpbnQJCXNpX3JlbV9hY2NlbnRzOwkvKiBzb3VuZHNhbGlrZTogcmVtb3ZlIGFjY2VudHMgKi8KICAgICBnYXJyYXlfVAlzaV9tYXA7CQkvKiBNQVAgaW5mbyBjb25jYXRlbmF0ZWQgKi8KICAgICBjaGFyX3UJKnNpX21pZHdvcmQ7CS8qIE1JRFdPUkQgY2hhcnMgb3IgTlVMTCAgKi8KQEAgLTQzMzcsMTUgKzQ2NDgsMjQgQEAKIHN0YXRpYyBpbnQgc3RvcmVfd29yZCBfX0FSR1MoKHNwZWxsaW5mb19UICpzcGluLCBjaGFyX3UgKndvcmQsIGludCBmbGFncywgaW50IHJlZ2lvbiwgY2hhcl91ICpwZnhsaXN0LCBpbnQgbmVlZF9hZmZpeCkpOwogc3RhdGljIGludCB0cmVlX2FkZF93b3JkIF9fQVJHUygoc3BlbGxpbmZvX1QgKnNwaW4sIGNoYXJfdSAqd29yZCwgd29yZG5vZGVfVCAqdHJlZSwgaW50IGZsYWdzLCBpbnQgcmVnaW9uLCBpbnQgYWZmaXhJRCkpOwogc3RhdGljIHdvcmRub2RlX1QgKmdldF93b3Jkbm9kZSBfX0FSR1MoKHNwZWxsaW5mb19UICpzcGluKSk7Ci1zdGF0aWMgdm9pZCBkZXJlZl93b3Jkbm9kZSBfX0FSR1MoKHNwZWxsaW5mb19UICpzcGluLCB3b3Jkbm9kZV9UICpub2RlKSk7CitzdGF0aWMgaW50IGRlcmVmX3dvcmRub2RlIF9fQVJHUygoc3BlbGxpbmZvX1QgKnNwaW4sIHdvcmRub2RlX1QgKm5vZGUpKTsKIHN0YXRpYyB2b2lkIGZyZWVfd29yZG5vZGUgX19BUkdTKChzcGVsbGluZm9fVCAqc3Bpbiwgd29yZG5vZGVfVCAqbikpOwogc3RhdGljIHZvaWQgd29yZHRyZWVfY29tcHJlc3MgX19BUkdTKChzcGVsbGluZm9fVCAqc3Bpbiwgd29yZG5vZGVfVCAqcm9vdCkpOwogc3RhdGljIGludCBub2RlX2NvbXByZXNzIF9fQVJHUygoc3BlbGxpbmZvX1QgKnNwaW4sIHdvcmRub2RlX1QgKm5vZGUsIGhhc2h0YWJfVCAqaHQsIGludCAqdG90KSk7CiBzdGF0aWMgaW50IG5vZGVfZXF1YWwgX19BUkdTKCh3b3Jkbm9kZV9UICpuMSwgd29yZG5vZGVfVCAqbjIpKTsKK3N0YXRpYyB2b2lkIHB1dF9zdWd0aW1lIF9fQVJHUygoc3BlbGxpbmZvX1QgKnNwaW4sIEZJTEUgKmZkKSk7CiBzdGF0aWMgaW50IHdyaXRlX3ZpbV9zcGVsbCBfX0FSR1MoKHNwZWxsaW5mb19UICpzcGluLCBjaGFyX3UgKmZuYW1lKSk7CiBzdGF0aWMgdm9pZCBjbGVhcl9ub2RlIF9fQVJHUygod29yZG5vZGVfVCAqbm9kZSkpOwogc3RhdGljIGludCBwdXRfbm9kZSBfX0FSR1MoKEZJTEUgKmZkLCB3b3Jkbm9kZV9UICpub2RlLCBpbnQgaW5kZXgsIGludCByZWdpb25tYXNrLCBpbnQgcHJlZml4dHJlZSkpOworc3RhdGljIHZvaWQgc3BlbGxfbWFrZV9zdWdmaWxlIF9fQVJHUygoc3BlbGxpbmZvX1QgKnNwaW4sIGNoYXJfdSAqd2ZuYW1lKSk7CitzdGF0aWMgaW50IHN1Z19maWxsdHJlZSBfX0FSR1MoKHNwZWxsaW5mb19UICpzcGluLCBzbGFuZ19UICpzbGFuZykpOworc3RhdGljIGludCBzdWdfbWFrZXRhYmxlIF9fQVJHUygoc3BlbGxpbmZvX1QgKnNwaW4pKTsKK3N0YXRpYyBpbnQgc3VnX2ZpbGx0YWJsZSBfX0FSR1MoKHNwZWxsaW5mb19UICpzcGluLCB3b3Jkbm9kZV9UICpub2RlLCBpbnQgc3RhcnR3b3JkbnIsIGdhcnJheV9UICpnYXApKTsKK3N0YXRpYyBpbnQgb2Zmc2V0MmJ5dGVzIF9fQVJHUygoaW50IG5yLCBjaGFyX3UgKmJ1ZikpOworc3RhdGljIGludCBieXRlczJvZmZzZXQgX19BUkdTKChjaGFyX3UgKipwcCkpOworc3RhdGljIHZvaWQgc3VnX3dyaXRlIF9fQVJHUygoc3BlbGxpbmZvX1QgKnNwaW4sIGNoYXJfdSAqZm5hbWUpKTsKIHN0YXRpYyB2b2lkIG1rc3BlbGwgX19BUkdTKChpbnQgZmNvdW50LCBjaGFyX3UgKipmbmFtZXMsIGludCBhc2NpaSwgaW50IG92ZXJ3cml0ZSwgaW50IGFkZGVkX3dvcmQpKTsKK3N0YXRpYyB2b2lkIHNwZWxsX21lc3NhZ2UgX19BUkdTKChzcGVsbGluZm9fVCAqc3BpbiwgY2hhcl91ICpzdHIpKTsKIHN0YXRpYyB2b2lkIGluaXRfc3BlbGxmaWxlIF9fQVJHUygodm9pZCkpOwogCiAvKiBJbiB0aGUgcG9zdHBvbmVkIHByZWZpeGVzIHRyZWUgd25fZmxhZ3MgaXMgdXNlZCB0byBzdG9yZSB0aGUgV0ZQXyBmbGFncywKQEAgLTQ0NzUsNyArNDc5NSw3IEBACiAgICAgY2hhcl91CXJsaW5lW01BWExJTkVMRU5dOwogICAgIGNoYXJfdQkqbGluZTsKICAgICBjaGFyX3UJKnBjID0gTlVMTDsKLSNkZWZpbmUgTUFYSVRFTUNOVCAgNworI2RlZmluZSBNQVhJVEVNQ05UICAzMAogICAgIGNoYXJfdQkqKGl0ZW1zW01BWElURU1DTlRdKTsKICAgICBpbnQJCWl0ZW1jbnQ7CiAgICAgY2hhcl91CSpwOwpAQCAtNDQ4OCw2ICs0ODA4LDcgQEAKICAgICBjaGFyX3UJKmZvbCA9IE5VTEw7CiAgICAgY2hhcl91CSp1cHAgPSBOVUxMOwogICAgIGludAkJZG9fcmVwOworICAgIGludAkJZG9fcmVwc2FsOwogICAgIGludAkJZG9fc2FsOwogICAgIGludAkJZG9fbWFwOwogICAgIGludAkJZm91bmRfbWFwID0gRkFMU0U7CkBAIC00NTEzLDE5ICs0ODM0LDE1IEBACiAJcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgaWYgKHNwaW4tPnNpX3ZlcmJvc2UgfHwgcF92ZXJib3NlID4gMikKLSAgICB7Ci0JaWYgKCFzcGluLT5zaV92ZXJib3NlKQotCSAgICB2ZXJib3NlX2VudGVyKCk7Ci0Jc21zZygoY2hhcl91ICopXygiUmVhZGluZyBhZmZpeCBmaWxlICVzIC4uLiIpLCBmbmFtZSk7Ci0Jb3V0X2ZsdXNoKCk7Ci0JaWYgKCFzcGluLT5zaV92ZXJib3NlKQotCSAgICB2ZXJib3NlX2xlYXZlKCk7Ci0gICAgfQorICAgIHZpbV9zbnByaW50ZigoY2hhciAqKUlPYnVmZiwgSU9TSVpFLCBfKCJSZWFkaW5nIGFmZml4IGZpbGUgJXMgLi4uIiksIGZuYW1lKTsKKyAgICBzcGVsbF9tZXNzYWdlKHNwaW4sIElPYnVmZik7CiAKICAgICAvKiBPbmx5IGRvIFJFUCBsaW5lcyB3aGVuIG5vdCBkb25lIGluIGFub3RoZXIgLmFmZiBmaWxlIGFscmVhZHkuICovCiAgICAgZG9fcmVwID0gc3Bpbi0+c2lfcmVwLmdhX2xlbiA9PSAwOwogCisgICAgLyogT25seSBkbyBSRVBTQUwgbGluZXMgd2hlbiBub3QgZG9uZSBpbiBhbm90aGVyIC5hZmYgZmlsZSBhbHJlYWR5LiAqLworICAgIGRvX3JlcHNhbCA9IHNwaW4tPnNpX3JlcHNhbC5nYV9sZW4gPT0gMDsKKwogICAgIC8qIE9ubHkgZG8gU0FMIGxpbmVzIHdoZW4gbm90IGRvbmUgaW4gYW5vdGhlciAuYWZmIGZpbGUgYWxyZWFkeS4gKi8KICAgICBkb19zYWwgPSBzcGluLT5zaV9zYWwuZ2FfbGVuID09IDA7CiAKQEAgLTQ3NTYsNiArNTA3MywxMCBAQAogCSAgICB7CiAJCXNwaW4tPnNpX25vYnJlYWsgPSBUUlVFOwogCSAgICB9CisJICAgIGVsc2UgaWYgKFNUUkNNUChpdGVtc1swXSwgIk5PU1VHRklMRSIpID09IDAgJiYgaXRlbWNudCA9PSAxKQorCSAgICB7CisJCXNwaW4tPnNpX25vc3VnZmlsZSA9IFRSVUU7CisJICAgIH0KIAkgICAgZWxzZSBpZiAoU1RSQ01QKGl0ZW1zWzBdLCAiUEZYUE9TVFBPTkUiKSA9PSAwICYmIGl0ZW1jbnQgPT0gMSkKIAkgICAgewogCQlhZmYtPmFmX3BmeHBvc3Rwb25lID0gVFJVRTsKQEAgLTUwNjEsMjEgKzUzODIsMjUgQEAKIAkgICAgewogCQl1cHAgPSB2aW1fc3Ryc2F2ZShpdGVtc1sxXSk7CiAJICAgIH0KLQkgICAgZWxzZSBpZiAoU1RSQ01QKGl0ZW1zWzBdLCAiUkVQIikgPT0gMCAmJiBpdGVtY250ID09IDIpCisJICAgIGVsc2UgaWYgKChTVFJDTVAoaXRlbXNbMF0sICJSRVAiKSA9PSAwCisJCQl8fCBTVFJDTVAoaXRlbXNbMF0sICJSRVBTQUwiKSA9PSAwKQorCQkgICAgJiYgaXRlbWNudCA9PSAyKQogCSAgICB7Ci0JCS8qIElnbm9yZSBSRVAgY291bnQgKi87CisJCS8qIElnbm9yZSBSRVAvUkVQU0FMIGNvdW50ICovOwogCQlpZiAoIWlzZGlnaXQoKml0ZW1zWzFdKSkKLQkJICAgIHNtc2coKGNoYXJfdSAqKV8oIkV4cGVjdGVkIFJFUCBjb3VudCBpbiAlcyBsaW5lICVkIiksCisJCSAgICBzbXNnKChjaGFyX3UgKilfKCJFeHBlY3RlZCBSRVAoU0FMKSBjb3VudCBpbiAlcyBsaW5lICVkIiksCiAJCQkJCQkJCSBmbmFtZSwgbG51bSk7CiAJICAgIH0KLQkgICAgZWxzZSBpZiAoU1RSQ01QKGl0ZW1zWzBdLCAiUkVQIikgPT0gMCAmJiBpdGVtY250ID49IDMpCisJICAgIGVsc2UgaWYgKChTVFJDTVAoaXRlbXNbMF0sICJSRVAiKSA9PSAwCisJCQl8fCBTVFJDTVAoaXRlbXNbMF0sICJSRVBTQUwiKSA9PSAwKQorCQkgICAgJiYgaXRlbWNudCA+PSAzKQogCSAgICB7Ci0JCS8qIFJFUCBpdGVtICovCisJCS8qIFJFUC9SRVBTQUwgaXRlbSAqLwogCQkvKiBNeXNwZWxsIGlnbm9yZXMgZXh0cmEgYXJndW1lbnRzLCB3ZSByZXF1aXJlIGl0IHN0YXJ0cyB3aXRoCiAJCSAqICMgdG8gZGV0ZWN0IG1pc3Rha2VzLiAqLwogCQlpZiAoaXRlbWNudCA+IDMgJiYgaXRlbXNbM11bMF0gIT0gJyMnKQogCQkgICAgc21zZygoY2hhcl91ICopXyhlX2FmZnRyYWlsaW5nKSwgZm5hbWUsIGxudW0sIGl0ZW1zWzNdKTsKLQkJaWYgKGRvX3JlcCkKKwkJaWYgKGl0ZW1zWzBdWzNdID09ICdTJyA/IGRvX3JlcHNhbCA6IGRvX3JlcCkKIAkJewogCQkgICAgLyogUmVwbGFjZSB1bmRlcnNjb3JlIHdpdGggc3BhY2UgKGNhbid0IGluY2x1ZGUgYSBzcGFjZQogCQkgICAgICogZGlyZWN0bHkpLiAqLwpAQCAtNTA4NSw3ICs1NDEwLDkgQEAKIAkJICAgIGZvciAocCA9IGl0ZW1zWzJdOyAqcCAhPSBOVUw7IG1iX3B0cl9hZHYocCkpCiAJCQlpZiAoKnAgPT0gJ18nKQogCQkJICAgICpwID0gJyAnOwotCQkgICAgYWRkX2Zyb210byhzcGluLCAmc3Bpbi0+c2lfcmVwLCBpdGVtc1sxXSwgaXRlbXNbMl0pOworCQkgICAgYWRkX2Zyb210byhzcGluLCBpdGVtc1swXVszXSA9PSAnUycKKwkJCQkJID8gJnNwaW4tPnNpX3JlcHNhbAorCQkJCQkgOiAmc3Bpbi0+c2lfcmVwLCBpdGVtc1sxXSwgaXRlbXNbMl0pOwogCQl9CiAJICAgIH0KIAkgICAgZWxzZSBpZiAoU1RSQ01QKGl0ZW1zWzBdLCAiTUFQIikgPT0gMCAmJiBpdGVtY250ID09IDIpCkBAIC01MTU2LDYgKzU0ODMsMjIgQEAKIAkgICAgewogCQlzb2ZvdG8gPSBnZXRyb29tX3NhdmUoc3BpbiwgaXRlbXNbMV0pOwogCSAgICB9CisJICAgIGVsc2UgaWYgKFNUUkNNUChpdGVtc1swXSwgIkNPTU1PTiIpID09IDApCisJICAgIHsKKwkJaW50CWk7CisKKwkJZm9yIChpID0gMTsgaSA8IGl0ZW1jbnQ7ICsraSkKKwkJeworCQkgICAgaWYgKEhBU0hJVEVNX0VNUFRZKGhhc2hfZmluZCgmc3Bpbi0+c2lfY29tbW9ud29yZHMsCisJCQkJCQkJCSAgIGl0ZW1zW2ldKSkpCisJCSAgICB7CisJCQlwID0gdmltX3N0cnNhdmUoaXRlbXNbaV0pOworCQkJaWYgKHAgPT0gTlVMTCkKKwkJCSAgICBicmVhazsKKwkJCWhhc2hfYWRkKCZzcGluLT5zaV9jb21tb253b3JkcywgcCk7CisJCSAgICB9CisJCX0KKwkgICAgfQogCSAgICBlbHNlCiAJCXNtc2coKGNoYXJfdSAqKV8oIlVucmVjb2duaXplZCBvciBkdXBsaWNhdGUgaXRlbSBpbiAlcyBsaW5lICVkOiAlcyIpLAogCQkJCQkJICAgICAgIGZuYW1lLCBsbnVtLCBpdGVtc1swXSk7CkBAIC01NjY1LDE1ICs2MDA4LDkgQEAKICAgICAvKiBUaGUgaGFzaHRhYmxlIGlzIG9ubHkgdXNlZCB0byBkZXRlY3QgZHVwbGljYXRlZCB3b3Jkcy4gKi8KICAgICBoYXNoX2luaXQoJmh0KTsKIAotICAgIGlmIChzcGluLT5zaV92ZXJib3NlIHx8IHBfdmVyYm9zZSA+IDIpCi0gICAgewotCWlmICghc3Bpbi0+c2lfdmVyYm9zZSkKLQkgICAgdmVyYm9zZV9lbnRlcigpOwotCXNtc2coKGNoYXJfdSAqKV8oIlJlYWRpbmcgZGljdGlvbmFyeSBmaWxlICVzIC4uLiIpLCBmbmFtZSk7Ci0Jb3V0X2ZsdXNoKCk7Ci0JaWYgKCFzcGluLT5zaV92ZXJib3NlKQotCSAgICB2ZXJib3NlX2xlYXZlKCk7Ci0gICAgfQorICAgIHZpbV9zbnByaW50ZigoY2hhciAqKUlPYnVmZiwgSU9TSVpFLAorCQkJCSAgXygiUmVhZGluZyBkaWN0aW9uYXJ5IGZpbGUgJXMgLi4uIiksIGZuYW1lKTsKKyAgICBzcGVsbF9tZXNzYWdlKHNwaW4sIElPYnVmZik7CiAKICAgICAvKiBzdGFydCB3aXRoIGEgbWVzc2FnZSBmb3IgdGhlIGZpcnN0IGxpbmUgKi8KICAgICBzcGluLT5zaV9tc2dfY291bnQgPSA5OTk5OTk7CkBAIC02MTIyLDE1ICs2NDU5LDggQEAKIAlyZXR1cm4gRkFJTDsKICAgICB9CiAKLSAgICBpZiAoc3Bpbi0+c2lfdmVyYm9zZSB8fCBwX3ZlcmJvc2UgPiAyKQotICAgIHsKLQlpZiAoIXNwaW4tPnNpX3ZlcmJvc2UpCi0JICAgIHZlcmJvc2VfZW50ZXIoKTsKLQlzbXNnKChjaGFyX3UgKilfKCJSZWFkaW5nIHdvcmQgZmlsZSAlcyAuLi4iKSwgZm5hbWUpOwotCW91dF9mbHVzaCgpOwotCWlmICghc3Bpbi0+c2lfdmVyYm9zZSkKLQkgICAgdmVyYm9zZV9sZWF2ZSgpOwotICAgIH0KKyAgICB2aW1fc25wcmludGYoKGNoYXIgKilJT2J1ZmYsIElPU0laRSwgXygiUmVhZGluZyB3b3JkIGZpbGUgJXMgLi4uIiksIGZuYW1lKTsKKyAgICBzcGVsbF9tZXNzYWdlKHNwaW4sIElPYnVmZik7CiAKICAgICAvKgogICAgICAqIFJlYWQgYWxsIHRoZSBsaW5lcyBpbiB0aGUgZmlsZSBvbmUgYnkgb25lLgpAQCAtNjI5NCwxNSArNjYyNCwxMyBAQAogICAgIHZpbV9mcmVlKHBjKTsKICAgICBmY2xvc2UoZmQpOwogCi0gICAgaWYgKHNwaW4tPnNpX2FzY2lpICYmIG5vbl9hc2NpaSA+IDAgJiYgKHNwaW4tPnNpX3ZlcmJvc2UgfHwgcF92ZXJib3NlID4gMikpCisgICAgaWYgKHNwaW4tPnNpX2FzY2lpICYmIG5vbl9hc2NpaSA+IDApCiAgICAgewotCWlmIChwX3ZlcmJvc2UgPiAyKQotCSAgICB2ZXJib3NlX2VudGVyKCk7Ci0Jc21zZygoY2hhcl91ICopXygiSWdub3JlZCAlZCB3b3JkcyB3aXRoIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIiksCi0JCQkJCQkJCSAgIG5vbl9hc2NpaSk7Ci0JaWYgKHBfdmVyYm9zZSA+IDIpCi0JICAgIHZlcmJvc2VfbGVhdmUoKTsKKwl2aW1fc25wcmludGYoKGNoYXIgKilJT2J1ZmYsIElPU0laRSwKKwkJICBfKCJJZ25vcmVkICVkIHdvcmRzIHdpdGggbm9uLUFTQ0lJIGNoYXJhY3RlcnMiKSwgbm9uX2FzY2lpKTsKKwlzcGVsbF9tZXNzYWdlKHNwaW4sIElPYnVmZik7CiAgICAgfQorCiAgICAgcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNjQ0Miw3ICs2NzcwLDcgQEAKIAogLyoKICAqIEFkZCB3b3JkICJ3b3JkIiB0byBhIHdvcmQgdHJlZSBhdCAicm9vdCIuCi0gKiBXaGVuICJmbGFncyIgPCAwIHdlIGFyZSBhZGRpbmcgdG8gdGhlIHByZWZpeCB0cmVlIHdoZXJlIGZsYWdzIGlzIHVzZWQgZm9yCisgKiBXaGVuICJmbGFncyIgPCAwIHdlIGFyZSBhZGRpbmcgdG8gdGhlIHByZWZpeCB0cmVlIHdoZXJlICJmbGFncyIgaXMgdXNlZCBmb3IKICAqICJyYXJlIiBhbmQgInJlZ2lvbiIgaXMgdGhlIGNvbmRpdGlvbiBuci4KICAqIFJldHVybnMgRkFJTCB3aGVuIG91dCBvZiBtZW1vcnkuCiAgKi8KQEAgLTY1MDcsMTAgKzY4MzUsMTMgQEAKIAkJJiYgKG5vZGUtPnduX2J5dGUgPCB3b3JkW2ldCiAJCSAgICB8fCAobm9kZS0+d25fYnl0ZSA9PSBOVUwKIAkJCSYmIChmbGFncyA8IDAKLQkJCSAgICA/IG5vZGUtPnduX2FmZml4SUQgPCBhZmZpeElECi0JCQkgICAgOiBub2RlLT53bl9mbGFncyA8IChmbGFncyAmIFdOX01BU0spCisJCQkgICAgPyBub2RlLT53bl9hZmZpeElEIDwgKHVuc2lnbmVkKWFmZml4SUQKKwkJCSAgICA6IChub2RlLT53bl9mbGFncyA8ICh1bnNpZ25lZCkoZmxhZ3MgJiBXTl9NQVNLKQogCQkJCXx8IChub2RlLT53bl9mbGFncyA9PSAoZmxhZ3MgJiBXTl9NQVNLKQotCQkJCSAgICAmJiBub2RlLT53bl9hZmZpeElEIDwgYWZmaXhJRCkpKSkpCisJCQkJICAgICYmIChzcGluLT5zaV9zdWd0cmVlCisJCQkJCT8gKG5vZGUtPnduX3JlZ2lvbiAmIDB4ZmZmZikgPCByZWdpb24KKwkJCQkJOiBub2RlLT53bl9hZmZpeElECisJCQkJCQkgICAgPCAodW5zaWduZWQpYWZmaXhJRCkpKSkpKSkKIAl7CiAJICAgIHByZXYgPSAmbm9kZS0+d25fc2libGluZzsKIAkgICAgbm9kZSA9ICpwcmV2OwpAQCAtNjUxOSw2ICs2ODUwLDcgQEAKIAkJfHwgbm9kZS0+d25fYnl0ZSAhPSB3b3JkW2ldCiAJCXx8ICh3b3JkW2ldID09IE5VTAogCQkgICAgJiYgKGZsYWdzIDwgMAorCQkJfHwgc3Bpbi0+c2lfc3VndHJlZQogCQkJfHwgbm9kZS0+d25fZmxhZ3MgIT0gKGZsYWdzICYgV05fTUFTSykKIAkJCXx8IG5vZGUtPnduX2FmZml4SUQgIT0gYWZmaXhJRCkpKQogCXsKQEAgLTY2MDYsOSArNjkzOCwxMSBAQAogCiAJLyogQ29tcHJlc3MgYm90aCB0cmVlcy4gIEVpdGhlciB0aGV5IGJvdGggaGF2ZSBtYW55IG5vZGVzLCB3aGljaCBtYWtlcwogCSAqIGNvbXByZXNzaW9uIHVzZWZ1bCwgb3Igb25lIG9mIHRoZW0gaXMgc21hbGwsIHdoaWNoIG1lYW5zCi0JICogY29tcHJlc3Npb24gZ29lcyBmYXN0LiAqLworCSAqIGNvbXByZXNzaW9uIGdvZXMgZmFzdC4gIEJ1dCB3aGVuIGZpbGxpbmcgdGhlIHNvdWxkZm9sZCB3b3JkIHRyZWUKKwkgKiB0aGVyZSBpcyBubyBrZWVwLWNhc2UgdHJlZS4gKi8KIAl3b3JkdHJlZV9jb21wcmVzcyhzcGluLCBzcGluLT5zaV9mb2xkcm9vdCk7Ci0Jd29yZHRyZWVfY29tcHJlc3Moc3Bpbiwgc3Bpbi0+c2lfa2VlcHJvb3QpOworCWlmIChhZmZpeElEID49IDApCisJICAgIHdvcmR0cmVlX2NvbXByZXNzKHNwaW4sIHNwaW4tPnNpX2tlZXByb290KTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CkBAIC02Njg0LDIxICs3MDE4LDI4IEBACiAgKiBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiBhIG5vZGUgKHdoaWNoIGlzIHRoZSBoZWFkIG9mIGEgbGlzdCBvZgogICogc2libGluZ3MpLiAgSWYgdGhlIHJlZmVyZW5jZSBjb3VudCBiZWNvbWVzIHplcm8gZnJlZSB0aGUgbm9kZSBhbmQgaXRzCiAgKiBzaWJsaW5ncy4KKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBub2RlcyBhY3R1YWxseSBmcmVlZC4KICAqLwotICAgIHN0YXRpYyB2b2lkCisgICAgc3RhdGljIGludAogZGVyZWZfd29yZG5vZGUoc3Bpbiwgbm9kZSkKICAgICBzcGVsbGluZm9fVCAqc3BpbjsKICAgICB3b3Jkbm9kZV9UICAqbm9kZTsKIHsKLSAgICB3b3Jkbm9kZV9UICpucDsKKyAgICB3b3Jkbm9kZV9UCSpucDsKKyAgICBpbnQJCWNudCA9IDA7CiAKICAgICBpZiAoLS1ub2RlLT53bl9yZWZzID09IDApCisgICAgewogCWZvciAobnAgPSBub2RlOyBucCAhPSBOVUxMOyBucCA9IG5wLT53bl9zaWJsaW5nKQogCXsKIAkgICAgaWYgKG5wLT53bl9jaGlsZCAhPSBOVUxMKQotCQlkZXJlZl93b3Jkbm9kZShzcGluLCBucC0+d25fY2hpbGQpOworCQljbnQgKz0gZGVyZWZfd29yZG5vZGUoc3BpbiwgbnAtPnduX2NoaWxkKTsKIAkgICAgZnJlZV93b3Jkbm9kZShzcGluLCBucCk7CisJICAgICsrY250OwogCX0KKwkrK2NudDsJICAgIC8qIGxlbmd0aCBmaWVsZCAqLworICAgIH0KKyAgICByZXR1cm4gY250OwogfQogCiAvKgpAQCAtNjczOSwxOCArNzA4MCwxNiBAQAogCWlmIChzcGluLT5zaV92ZXJib3NlIHx8IHBfdmVyYm9zZSA+IDIpCiAjZW5kaWYKIAl7Ci0JICAgIGlmICghc3Bpbi0+c2lfdmVyYm9zZSkKLQkJdmVyYm9zZV9lbnRlcigpOwogCSAgICBpZiAodG90ID4gMTAwMDAwMCkKIAkJcGVyYyA9ICh0b3QgLSBuKSAvICh0b3QgLyAxMDApOwogCSAgICBlbHNlIGlmICh0b3QgPT0gMCkKIAkJcGVyYyA9IDA7CiAJICAgIGVsc2UKIAkJcGVyYyA9ICh0b3QgLSBuKSAqIDEwMCAvIHRvdDsKLQkgICAgc21zZygoY2hhcl91ICopXygiQ29tcHJlc3NlZCAlZCBvZiAlZCBub2RlczsgJWQlJSByZW1haW5pbmciKSwKLQkJCQkJCQkJbiwgdG90LCBwZXJjKTsKLQkgICAgaWYgKHBfdmVyYm9zZSA+IDIpCi0JCXZlcmJvc2VfbGVhdmUoKTsKKwkgICAgdmltX3NucHJpbnRmKChjaGFyICopSU9idWZmLCBJT1NJWkUsCisJCQkgIF8oIkNvbXByZXNzZWQgJWQgb2YgJWQgbm9kZXM7ICVkICglZCUlKSByZW1haW5pbmciKSwKKwkJCQkJCSAgICAgICBuLCB0b3QsIHRvdCAtIG4sIHBlcmMpOworCSAgICBzcGVsbF9tZXNzYWdlKHNwaW4sIElPYnVmZik7CiAJfQogI2lmZGVmIFNQRUxMX1BSSU5UVFJFRQogCXNwZWxsX3ByaW50X3RyZWUocm9vdC0+d25fc2libGluZyk7CkBAIC02Nzg0LDI0ICs3MTIzLDI0IEBACiAgICAgICogR28gdGhyb3VnaCB0aGUgbGlzdCBvZiBzaWJsaW5ncy4gIENvbXByZXNzIGVhY2ggY2hpbGQgYW5kIHRoZW4gdHJ5CiAgICAgICogZmluZGluZyBhbiBpZGVudGljYWwgY2hpbGQgdG8gcmVwbGFjZSBpdC4KICAgICAgKiBOb3RlIHRoYXQgd2l0aCAiY2hpbGQiIHdlIG1lYW4gbm90IGp1c3QgdGhlIG5vZGUgdGhhdCBpcyBwb2ludGVkIHRvLAotICAgICAqIGJ1dCB0aGUgd2hvbGUgbGlzdCBvZiBzaWJsaW5ncywgb2Ygd2hpY2ggdGhlIG5vZGUgaXMgdGhlIGZpcnN0LgorICAgICAqIGJ1dCB0aGUgd2hvbGUgbGlzdCBvZiBzaWJsaW5ncyBvZiB3aGljaCB0aGUgY2hpbGQgbm9kZSBpcyB0aGUgZmlyc3QuCiAgICAgICovCiAgICAgZm9yIChucCA9IG5vZGU7IG5wICE9IE5VTEwgJiYgIWdvdF9pbnQ7IG5wID0gbnAtPnduX3NpYmxpbmcpCiAgICAgewogCSsrbGVuOwogCWlmICgoY2hpbGQgPSBucC0+d25fY2hpbGQpICE9IE5VTEwpCiAJewotCSAgICAvKiBDb21wcmVzcyB0aGUgY2hpbGQuICBUaGlzIGZpbGxzIGhhc2hrZXkuICovCisJICAgIC8qIENvbXByZXNzIHRoZSBjaGlsZCBmaXJzdC4gIFRoaXMgZmlsbHMgaGFzaGtleS4gKi8KIAkgICAgY29tcHJlc3NlZCArPSBub2RlX2NvbXByZXNzKHNwaW4sIGNoaWxkLCBodCwgdG90KTsKIAogCSAgICAvKiBUcnkgdG8gZmluZCBhbiBpZGVudGljYWwgY2hpbGQuICovCiAJICAgIGhhc2ggPSBoYXNoX2hhc2goY2hpbGQtPnduX3UxLmhhc2hrZXkpOwogCSAgICBoaSA9IGhhc2hfbG9va3VwKGh0LCBjaGlsZC0+d25fdTEuaGFzaGtleSwgaGFzaCk7Ci0JICAgIHRwID0gTlVMTDsKIAkgICAgaWYgKCFIQVNISVRFTV9FTVBUWShoaSkpCiAJICAgIHsKLQkJLyogVGhlcmUgYXJlIGNoaWxkcmVuIHdpdGggYW4gaWRlbnRpY2FsIGhhc2ggdmFsdWUuICBOb3cgY2hlY2sKLQkJICogaWYgdGhlcmUgaXMgb25lIHRoYXQgaXMgcmVhbGx5IGlkZW50aWNhbC4gKi8KKwkJLyogVGhlcmUgYXJlIGNoaWxkcmVuIHdlIGVuY291bnRlcmVkIGJlZm9yZSB3aXRoIGEgaGFzaCB2YWx1ZQorCQkgKiBpZGVudGljYWwgdG8gdGhlIGN1cnJlbnQgY2hpbGQuICBOb3cgY2hlY2sgaWYgdGhlcmUgaXMgb25lCisJCSAqIHRoYXQgaXMgcmVhbGx5IGlkZW50aWNhbC4gKi8KIAkJZm9yICh0cCA9IEhJMldOKGhpKTsgdHAgIT0gTlVMTDsgdHAgPSB0cC0+d25fdTIubmV4dCkKIAkJICAgIGlmIChub2RlX2VxdWFsKGNoaWxkLCB0cCkpCiAJCSAgICB7CkBAIC02ODA5LDkgKzcxNDgsOCBAQAogCQkJICogY3VycmVudCBvbmUuICBUaGlzIG1lYW5zIHRoZSBjdXJyZW50IGNoaWxkIGFuZCBhbGwKIAkJCSAqIGl0cyBzaWJsaW5ncyBpcyB1bmxpbmtlZCBmcm9tIHRoZSB0cmVlLiAqLwogCQkJKyt0cC0+d25fcmVmczsKLQkJCWRlcmVmX3dvcmRub2RlKHNwaW4sIGNoaWxkKTsKKwkJCWNvbXByZXNzZWQgKz0gZGVyZWZfd29yZG5vZGUoc3BpbiwgY2hpbGQpOwogCQkJbnAtPnduX2NoaWxkID0gdHA7Ci0JCQkrK2NvbXByZXNzZWQ7CiAJCQlicmVhazsKIAkJICAgIH0KIAkJaWYgKHRwID09IE5VTEwpCkBAIC02ODMwLDcgKzcxNjgsNyBAQAogCQloYXNoX2FkZF9pdGVtKGh0LCBoaSwgY2hpbGQtPnduX3UxLmhhc2hrZXksIGhhc2gpOwogCX0KICAgICB9Ci0gICAgKnRvdCArPSBsZW47CisgICAgKnRvdCArPSBsZW4gKyAxOwkvKiBhZGQgb25lIGZvciB0aGUgbm9kZSB0aGF0IHN0b3JlcyB0aGUgbGVuZ3RoICovCiAKICAgICAvKgogICAgICAqIE1ha2UgYSBoYXNoIGtleSBmb3IgdGhlIG5vZGUgYW5kIGl0cyBzaWJsaW5ncywgc28gdGhhdCB3ZSBjYW4gcXVpY2tseQpAQCAtNjkwNiw2ICs3MjQ0LDMwIEBACiAJcHV0YygoaW50KShuciA+PiAoaSAqIDgpKSwgZmQpOwogfQogCisvKgorICogV3JpdGUgc3Bpbi0+c2lfc3VndGltZSB0byBmaWxlICJmZCIuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorcHV0X3N1Z3RpbWUoc3BpbiwgZmQpCisgICAgc3BlbGxpbmZvX1QgKnNwaW47CisgICAgRklMRQkqZmQ7Cit7CisgICAgaW50CQljOworICAgIGludAkJaTsKKworICAgIC8qIHRpbWVfdCBjYW4gYmUgdXAgdG8gOCBieXRlcyBpbiBzaXplLCBtb3JlIHRoYW4gbG9uZ191LCB0aHVzIHdlCisgICAgICogY2FuJ3QgdXNlIHB1dF9ieXRlcygpIGhlcmUuICovCisgICAgZm9yIChpID0gNzsgaSA+PSAwOyAtLWkpCisJaWYgKGkgKyAxID4gc2l6ZW9mKHRpbWVfdCkpCisJICAgIC8qICI+PiIgZG9lc24ndCB3b3JrIHdlbGwgd2hlbiBzaGlmdGluZyBtb3JlIGJpdHMgdGhhbiBhdmFpbCAqLworCSAgICBwdXRjKDAsIGZkKTsKKwllbHNlCisJeworCSAgICBjID0gKHVuc2lnbmVkKXNwaW4tPnNpX3N1Z3RpbWUgPj4gKGkgKiA4KTsKKwkgICAgcHV0YyhjLCBmZCk7CisJfQorfQorCiBzdGF0aWMgaW50CiAjaWZkZWYgX19CT1JMQU5EQ19fCiBfUlRMRU5UUllGCkBAIC03MDU2LDI5ICs3NDE4LDM3IEBACiAgICAgfQogCiAgICAgLyogU05fUkVQOiA8cmVwY291bnQ+IDxyZXA+IC4uLgotICAgICAqIFNOX1NBTDogPHNhbGZsYWdzPiA8c2FsY291bnQ+IDxzYWw+IC4uLiAqLwotCi0gICAgLyogU29ydCB0aGUgUkVQIGl0ZW1zLiAqLwotICAgIHFzb3J0KHNwaW4tPnNpX3JlcC5nYV9kYXRhLCAoc2l6ZV90KXNwaW4tPnNpX3JlcC5nYV9sZW4sCi0JCQkJCSAgICAgICBzaXplb2YoZnJvbXRvX1QpLCByZXBfY29tcGFyZSk7CisgICAgICogU05fU0FMOiA8c2FsZmxhZ3M+IDxzYWxjb3VudD4gPHNhbD4gLi4uCisgICAgICogU05fUkVQU0FMOiA8cmVwY291bnQ+IDxyZXA+IC4uLiAqLwogCiAgICAgLyogcm91bmQgMTogU05fUkVQIHNlY3Rpb24KLSAgICAgKiByb3VuZCAyOiBTTl9TQUwgc2VjdGlvbiAodW5sZXNzIFNOX1NPRk8gaXMgdXNlZCkgKi8KLSAgICBmb3IgKHJvdW5kID0gMTsgcm91bmQgPD0gMjsgKytyb3VuZCkKKyAgICAgKiByb3VuZCAyOiBTTl9TQUwgc2VjdGlvbiAodW5sZXNzIFNOX1NPRk8gaXMgdXNlZCkKKyAgICAgKiByb3VuZCAzOiBTTl9SRVBTQUwgc2VjdGlvbiAqLworICAgIGZvciAocm91bmQgPSAxOyByb3VuZCA8PSAzOyArK3JvdW5kKQogICAgIHsKIAlpZiAocm91bmQgPT0gMSkKLQl7CiAJICAgIGdhcCA9ICZzcGluLT5zaV9yZXA7Ci0JICAgIHB1dGMoU05fUkVQLCBmZCk7CQkJCS8qIDxzZWN0aW9uSUQ+ICovCisJZWxzZSBpZiAocm91bmQgPT0gMikKKwl7CisJICAgIC8qIERvbid0IHdyaXRlIFNOX1NBTCB3aGVuIHVzaW5nIGEgU05fU09GTyBzZWN0aW9uICovCisJICAgIGlmIChzcGluLT5zaV9zb2ZvZnIgIT0gTlVMTCAmJiBzcGluLT5zaV9zb2ZvdG8gIT0gTlVMTCkKKwkJY29udGludWU7CisJICAgIGdhcCA9ICZzcGluLT5zaV9zYWw7CiAJfQogCWVsc2UKLQl7Ci0JICAgIGlmIChzcGluLT5zaV9zb2ZvZnIgIT0gTlVMTCAmJiBzcGluLT5zaV9zb2ZvdG8gIT0gTlVMTCkKLQkJLyogdXNpbmcgU05fU09GTyBzZWN0aW9uIGluc3RlYWQgb2YgU05fU0FMICovCi0JCWJyZWFrOwotCSAgICBnYXAgPSAmc3Bpbi0+c2lfc2FsOwotCSAgICBwdXRjKFNOX1NBTCwgZmQpOwkJCQkvKiA8c2VjdGlvbklEPiAqLwotCX0KKwkgICAgZ2FwID0gJnNwaW4tPnNpX3JlcHNhbDsKKworCS8qIERvbid0IHdyaXRlIHRoZSBzZWN0aW9uIGlmIHRoZXJlIGFyZSBubyBpdGVtcy4gKi8KKwlpZiAoZ2FwLT5nYV9sZW4gPT0gMCkKKwkgICAgY29udGludWU7CisKKwkvKiBTb3J0IHRoZSBSRVAvUkVQU0FMIGl0ZW1zLiAqLworCWlmIChyb3VuZCAhPSAyKQorCSAgICBxc29ydChnYXAtPmdhX2RhdGEsIChzaXplX3QpZ2FwLT5nYV9sZW4sCisJCQkJCSAgICAgICBzaXplb2YoZnJvbXRvX1QpLCByZXBfY29tcGFyZSk7CisKKwlpID0gcm91bmQgPT0gMSA/IFNOX1JFUCA6IChyb3VuZCA9PSAyID8gU05fU0FMIDogU05fUkVQU0FMKTsKKwlwdXRjKGksIGZkKTsJCQkJCS8qIDxzZWN0aW9uSUQ+ICovCiAKIAkvKiBUaGlzIGlzIGZvciBtYWtpbmcgc3VnZ2VzdGlvbnMsIHNlY3Rpb24gaXMgbm90IHJlcXVpcmVkLiAqLwogCXB1dGMoMCwgZmQpOwkJCQkJLyogPHNlY3Rpb25mbGFncz4gKi8KQEAgLTcxNDMsNiArNzUxMywzNiBAQAogCWZ3cml0ZShzcGluLT5zaV9zb2ZvdG8sIGwsIChzaXplX3QpMSwgZmQpOwkvKiA8c29mb3RvPiAqLwogICAgIH0KIAorICAgIC8qIFNOX1dPUkRTOiA8d29yZD4gLi4uCisgICAgICogVGhpcyBpcyBmb3IgbWFraW5nIHN1Z2dlc3Rpb25zLCBzZWN0aW9uIGlzIG5vdCByZXF1aXJlZC4gKi8KKyAgICBpZiAoc3Bpbi0+c2lfY29tbW9ud29yZHMuaHRfdXNlZCA+IDApCisgICAgeworCXB1dGMoU05fV09SRFMsIGZkKTsJCQkJLyogPHNlY3Rpb25JRD4gKi8KKwlwdXRjKDAsIGZkKTsJCQkJCS8qIDxzZWN0aW9uZmxhZ3M+ICovCisKKwkvKiByb3VuZCAxOiBjb3VudCB0aGUgYnl0ZXMKKwkgKiByb3VuZCAyOiB3cml0ZSB0aGUgYnl0ZXMgKi8KKwlmb3IgKHJvdW5kID0gMTsgcm91bmQgPD0gMjsgKytyb3VuZCkKKwl7CisJICAgIGludAkJdG9kbzsKKwkgICAgaW50CQlsZW4gPSAwOworCSAgICBoYXNoaXRlbV9UCSpoaTsKKworCSAgICB0b2RvID0gc3Bpbi0+c2lfY29tbW9ud29yZHMuaHRfdXNlZDsKKwkgICAgZm9yIChoaSA9IHNwaW4tPnNpX2NvbW1vbndvcmRzLmh0X2FycmF5OyB0b2RvID4gMDsgKytoaSkKKwkJaWYgKCFIQVNISVRFTV9FTVBUWShoaSkpCisJCXsKKwkJICAgIGwgPSBTVFJMRU4oaGktPmhpX2tleSkgKyAxOworCQkgICAgbGVuICs9IGw7CisJCSAgICBpZiAocm91bmQgPT0gMikJCQkvKiA8d29yZD4gKi8KKwkJCWZ3cml0ZShoaS0+aGlfa2V5LCAoc2l6ZV90KWwsIChzaXplX3QpMSwgZmQpOworCQkgICAgLS10b2RvOworCQl9CisJICAgIGlmIChyb3VuZCA9PSAxKQorCQlwdXRfYnl0ZXMoZmQsIChsb25nX3UpbGVuLCA0KTsJCS8qIDxzZWN0aW9ubGVuPiAqLworCX0KKyAgICB9CisKICAgICAvKiBTTl9NQVA6IDxtYXBzdHI+CiAgICAgICogVGhpcyBpcyBmb3IgbWFraW5nIHN1Z2dlc3Rpb25zLCBzZWN0aW9uIGlzIG5vdCByZXF1aXJlZC4gKi8KICAgICBpZiAoc3Bpbi0+c2lfbWFwLmdhX2xlbiA+IDApCkBAIC03MTU1LDYgKzc1NTUsMjQgQEAKIAkJCQkJCQkvKiA8bWFwc3RyPiAqLwogICAgIH0KIAorICAgIC8qIFNOX1NVR0ZJTEU6IDx0aW1lc3RhbXA+CisgICAgICogVGhpcyBpcyB1c2VkIHRvIG5vdGlmeSB0aGF0IGEgLnN1ZyBmaWxlIG1heSBiZSBhdmFpbGFibGUgYW5kIGF0IHRoZQorICAgICAqIHNhbWUgdGltZSBhbGxvd3MgZm9yIGNoZWNraW5nIHRoYXQgYSAuc3VnIGZpbGUgdGhhdCBpcyBmb3VuZCBtYXRjaGVzCisgICAgICogd2l0aCB0aGlzIC5zcGwgZmlsZS4gIFRoYXQncyBiZWNhdXNlIHRoZSB3b3JkIG51bWJlcnMgbXVzdCBiZSBleGFjdGx5CisgICAgICogcmlnaHQuICovCisgICAgaWYgKCFzcGluLT5zaV9ub3N1Z2ZpbGUKKwkgICAgJiYgKHNwaW4tPnNpX3NhbC5nYV9sZW4gPiAwCisJCSAgICAgfHwgKHNwaW4tPnNpX3NvZm9mciAhPSBOVUxMICYmIHNwaW4tPnNpX3NvZm90byAhPSBOVUxMKSkpCisgICAgeworCXB1dGMoU05fU1VHRklMRSwgZmQpOwkJCQkvKiA8c2VjdGlvbklEPiAqLworCXB1dGMoMCwgZmQpOwkJCQkJLyogPHNlY3Rpb25mbGFncz4gKi8KKwlwdXRfYnl0ZXMoZmQsIChsb25nX3UpOCwgNCk7CQkJLyogPHNlY3Rpb25sZW4+ICovCisKKwkvKiBTZXQgc2lfc3VndGltZSBhbmQgd3JpdGUgaXQgdG8gdGhlIGZpbGUuICovCisJc3Bpbi0+c2lfc3VndGltZSA9IHRpbWUoTlVMTCk7CisJcHV0X3N1Z3RpbWUoc3BpbiwgZmQpOwkJCQkvKiA8dGltZXN0YW1wPiAqLworICAgIH0KKwogICAgIC8qIFNOX0NPTVBPVU5EOiBjb21wb3VuZCBpbmZvLgogICAgICAqIFdlIGRvbid0IG1hcmsgaXQgcmVxdWlyZWQsIHdoZW4gbm90IHN1cHBvcnRlZCBhbGwgY29tcG91bmQgd29yZHMgd2lsbAogICAgICAqIGJlIGJhZCB3b3Jkcy4gKi8KQEAgLTcyNjcsOSArNzY4NSw5IEBACiAgKiBUaGlzIGZpcnN0IHdyaXRlcyB0aGUgbGlzdCBvZiBwb3NzaWJsZSBieXRlcyAoc2libGluZ3MpLiAgVGhlbiBmb3IgZWFjaAogICogYnl0ZSByZWN1cnNpdmVseSB3cml0ZSB0aGUgY2hpbGRyZW4uCiAgKgotICogTk9URTogVGhlIGNvZGUgaGVyZSBtdXN0IG1hdGNoIHRoZSBjb2RlIGluIHJlYWRfdHJlZSgpLCBzaW5jZSBhc3N1bXB0aW9ucwotICogYXJlIG1hZGUgYWJvdXQgdGhlIGluZGV4ZXMgKHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byB3cml0ZSB0aGVtIGluIHRoZQotICogZmlsZSkuCisgKiBOT1RFOiBUaGUgY29kZSBoZXJlIG11c3QgbWF0Y2ggdGhlIGNvZGUgaW4gcmVhZF90cmVlX25vZGUoKSwgc2luY2UKKyAqIGFzc3VtcHRpb25zIGFyZSBtYWRlIGFib3V0IHRoZSBpbmRleGVzIChzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gd3JpdGUgdGhlbQorICogaW4gdGhlIGZpbGUpLgogICoKICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBub2RlcyB1c2VkLgogICovCkBAIC03NDI3LDYgKzc4NDUsNTIwIEBACiB9CiAKIC8qCisgKiBDcmVhdGUgdGhlIC5zdWcgZmlsZS4KKyAqIFVzZXMgdGhlIHNvdW5kZm9sZCBpbmZvIGluICJzcGluIi4KKyAqIFdyaXRlcyB0aGUgZmlsZSB3aXRoIHRoZSBuYW1lICJ3Zm5hbWUiLCB3aXRoICIuc3BsIiBjaGFuZ2VkIHRvICIuc3VnIi4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzcGVsbF9tYWtlX3N1Z2ZpbGUoc3Bpbiwgd2ZuYW1lKQorICAgIHNwZWxsaW5mb19UCSpzcGluOworICAgIGNoYXJfdQkqd2ZuYW1lOworeworICAgIGNoYXJfdQlmbmFtZVtNQVhQQVRITF07CisgICAgaW50CQlsZW47CisgICAgc2xhbmdfVAkqc2xhbmc7CisgICAgaW50CQlmcmVlX3NsYW5nID0gRkFMU0U7CisKKyAgICAvKgorICAgICAqIFJlYWQgYmFjayB0aGUgLnNwbCBmaWxlIHRoYXQgd2FzIHdyaXR0ZW4uICBUaGlzIGZpbGxzIHRoZSByZXF1aXJlZAorICAgICAqIGluZm8gZm9yIHNvdW5kZm9sZGluZy4gIFRoaXMgYWxzbyB1c2VzIGxlc3MgbWVtb3J5IHRoYW4gdGhlCisgICAgICogcG9pbnRlci1saW5rZWQgdmVyc2lvbiBvZiB0aGUgdHJpZS4gIEFuZCBpdCBhdm9pZHMgaGF2aW5nIHR3byB2ZXJzaW9ucworICAgICAqIG9mIHRoZSBjb2RlIGZvciB0aGUgc291bmRmb2xkaW5nIHN0dWZmLgorICAgICAqIEl0IG1pZ2h0IGhhdmUgYmVlbiBkb25lIGFscmVhZHkgYnkgc3BlbGxfcmVsb2FkX29uZSgpLgorICAgICAqLworICAgIGZvciAoc2xhbmcgPSBmaXJzdF9sYW5nOyBzbGFuZyAhPSBOVUxMOyBzbGFuZyA9IHNsYW5nLT5zbF9uZXh0KQorCWlmIChmdWxscGF0aGNtcCh3Zm5hbWUsIHNsYW5nLT5zbF9mbmFtZSwgRkFMU0UpID09IEZQQ19TQU1FKQorCSAgICBicmVhazsKKyAgICBpZiAoc2xhbmcgPT0gTlVMTCkKKyAgICB7CisJc3BlbGxfbWVzc2FnZShzcGluLCAoY2hhcl91ICopXygiUmVhZGluZyBiYWNrIHNwZWxsIGZpbGUuLi4iKSk7CisJc2xhbmcgPSBzcGVsbF9sb2FkX2ZpbGUod2ZuYW1lLCBOVUxMLCBOVUxMLCBGQUxTRSk7CisJaWYgKHNsYW5nID09IE5VTEwpCisJICAgIHJldHVybjsKKwkvKiBkb24ndCB3YW50IHRoaXMgbGFuZ3VhZ2UgaW4gdGhlIGxpc3QgKi8KKwlpZiAoZmlyc3RfbGFuZyA9PSBzbGFuZykKKwkgICAgZmlyc3RfbGFuZyA9IHNsYW5nLT5zbF9uZXh0OworCWZyZWVfc2xhbmcgPSBUUlVFOworICAgIH0KKworICAgIC8qCisgICAgICogQ2xlYXIgdGhlIGluZm8gaW4gInNwaW4iIHRoYXQgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBzcGluLT5zaV9ibG9ja3MgPSBOVUxMOworICAgIHNwaW4tPnNpX2Jsb2Nrc19jbnQgPSAwOworICAgIHNwaW4tPnNpX2NvbXByZXNzX2NudCA9IDA7CSAgICAvKiB3aWxsIHN0YXkgYXQgMCBhbGwgdGhlIHRpbWUqLworICAgIHNwaW4tPnNpX2ZyZWVfY291bnQgPSAwOworICAgIHNwaW4tPnNpX2ZpcnN0X2ZyZWUgPSBOVUxMOworICAgIHNwaW4tPnNpX2ZvbGR3Y291bnQgPSAwOworCisgICAgLyoKKyAgICAgKiBHbyB0aHJvdWdoIHRoZSB0cmllIG9mIGdvb2Qgd29yZHMsIHNvdW5kZm9sZCBlYWNoIHdvcmQgYW5kIGFkZCBpdCB0bworICAgICAqIHRoZSBzb3VuZGZvbGQgdHJpZS4KKyAgICAgKi8KKyAgICBzcGVsbF9tZXNzYWdlKHNwaW4sIChjaGFyX3UgKilfKCJQZXJmb3JtaW5nIHNvdW5kZm9sZGluZy4uLiIpKTsKKyAgICBpZiAoc3VnX2ZpbGx0cmVlKHNwaW4sIHNsYW5nKSA9PSBGQUlMKQorCWdvdG8gdGhlZW5kOworCisgICAgLyoKKyAgICAgKiBDcmVhdGUgdGhlIHRhYmxlIHdoaWNoIGxpbmtzIGVhY2ggc291bmRmb2xkIHdvcmQgd2l0aCBhIGxpc3Qgb2YgdGhlCisgICAgICogZ29vZCB3b3JkcyBpdCBtYXkgY29tZSBmcm9tLiAgQ3JlYXRlcyBidWZmZXIgInNwaW4tPnNpX3NwZWxsYnVmIi4KKyAgICAgKiBUaGlzIGFsc28gcmVtb3ZlcyB0aGUgd29yZG5yIGZyb20gdGhlIE5VTCBieXRlIGVudHJpZXMgdG8gbWFrZQorICAgICAqIGNvbXByZXNzaW9uIHBvc3NpYmxlLgorICAgICAqLworICAgIGlmIChzdWdfbWFrZXRhYmxlKHNwaW4pID09IEZBSUwpCisJZ290byB0aGVlbmQ7CisKKyAgICBzbXNnKChjaGFyX3UgKilfKCJOdW1iZXIgb2Ygd29yZHMgYWZ0ZXIgc291bmRmb2xkaW5nOiAlbGQiKSwKKwkJCQkgKGxvbmcpc3Bpbi0+c2lfc3BlbGxidWYtPmJfbWwubWxfbGluZV9jb3VudCk7CisKKyAgICAvKgorICAgICAqIENvbXByZXNzIHRoZSBzb3VuZGZvbGQgdHJpZS4KKyAgICAgKi8KKyAgICBzcGVsbF9tZXNzYWdlKHNwaW4sIChjaGFyX3UgKilfKG1zZ19jb21wcmVzc2luZykpOworICAgIHdvcmR0cmVlX2NvbXByZXNzKHNwaW4sIHNwaW4tPnNpX2ZvbGRyb290KTsKKworICAgIC8qCisgICAgICogV3JpdGUgdGhlIC5zdWcgZmlsZS4KKyAgICAgKiBNYWtlIHRoZSBmaWxlIG5hbWUgYnkgY2hhbmdpbmcgIi5zcGwiIHRvICIuc3VnIi4KKyAgICAgKi8KKyAgICBTVFJDUFkoZm5hbWUsIHdmbmFtZSk7CisgICAgbGVuID0gU1RSTEVOKGZuYW1lKTsKKyAgICBmbmFtZVtsZW4gLSAyXSA9ICd1JzsKKyAgICBmbmFtZVtsZW4gLSAxXSA9ICdnJzsKKyAgICBzdWdfd3JpdGUoc3BpbiwgZm5hbWUpOworCit0aGVlbmQ6CisgICAgaWYgKGZyZWVfc2xhbmcpCisJc2xhbmdfZnJlZShzbGFuZyk7CisgICAgZnJlZV9ibG9ja3Moc3Bpbi0+c2lfYmxvY2tzKTsKKyAgICBjbG9zZV9zcGVsbGJ1ZihzcGluLT5zaV9zcGVsbGJ1Zik7Cit9CisKKy8qCisgKiBCdWlsZCB0aGUgc291bmRmb2xkIHRyaWUgZm9yIGxhbmd1YWdlICJzbGFuZyIuCisgKi8KKyAgICBzdGF0aWMgaW50CitzdWdfZmlsbHRyZWUoc3Bpbiwgc2xhbmcpCisgICAgc3BlbGxpbmZvX1QJKnNwaW47CisgICAgc2xhbmdfVAkqc2xhbmc7Cit7CisgICAgY2hhcl91CSpieXRzOworICAgIGlkeF9UCSppZHhzOworICAgIGludAkJZGVwdGg7CisgICAgaWR4X1QJYXJyaWR4W01BWFdMRU5dOworICAgIGludAkJY3VyaVtNQVhXTEVOXTsKKyAgICBjaGFyX3UJdHdvcmRbTUFYV0xFTl07CisgICAgY2hhcl91CXRzYWx3b3JkW01BWFdMRU5dOworICAgIGludAkJYzsKKyAgICBpZHhfVAluOworICAgIHVuc2lnbmVkCXdvcmRzX2RvbmUgPSAwOworICAgIGludAkJd29yZGNvdW50W01BWFdMRU5dOworCisgICAgLyogV2UgdXNlIHNpX2ZvbGRyb290IGZvciB0aGUgc291bGRmb2xkZWQgdHJpZS4gKi8KKyAgICBzcGluLT5zaV9mb2xkcm9vdCA9IHdvcmR0cmVlX2FsbG9jKHNwaW4pOworICAgIGlmIChzcGluLT5zaV9mb2xkcm9vdCA9PSBOVUxMKQorCXJldHVybiBGQUlMOworCisgICAgLyogbGV0IHRyZWVfYWRkX3dvcmQoKSBrbm93IHdlJ3JlIGFkZGluZyB0byB0aGUgc291bmRmb2xkZWQgdHJlZSAqLworICAgIHNwaW4tPnNpX3N1Z3RyZWUgPSBUUlVFOworCisgICAgLyoKKyAgICAgKiBHbyB0aHJvdWdoIHRoZSB3aG9sZSBjYXNlLWZvbGRlZCB0cmVlLCBzb3VuZGZvbGQgZWFjaCB3b3JkIGFuZCBwdXQgaXQKKyAgICAgKiBpbiB0aGUgdHJpZS4KKyAgICAgKi8KKyAgICBieXRzID0gc2xhbmctPnNsX2ZieXRzOworICAgIGlkeHMgPSBzbGFuZy0+c2xfZmlkeHM7CisKKyAgICBhcnJpZHhbMF0gPSAwOworICAgIGN1cmlbMF0gPSAxOworICAgIHdvcmRjb3VudFswXSA9IDA7CisKKyAgICBkZXB0aCA9IDA7CisgICAgd2hpbGUgKGRlcHRoID49IDAgJiYgIWdvdF9pbnQpCisgICAgeworCWlmIChjdXJpW2RlcHRoXSA+IGJ5dHNbYXJyaWR4W2RlcHRoXV0pCisJeworCSAgICAvKiBEb25lIGFsbCBieXRlcyBhdCB0aGlzIG5vZGUsIGdvIHVwIG9uZSBsZXZlbC4gKi8KKwkgICAgaWR4c1thcnJpZHhbZGVwdGhdXSA9IHdvcmRjb3VudFtkZXB0aF07CisJICAgIGlmIChkZXB0aCA+IDApCisJCXdvcmRjb3VudFtkZXB0aCAtIDFdICs9IHdvcmRjb3VudFtkZXB0aF07CisKKwkgICAgLS1kZXB0aDsKKwkgICAgbGluZV9icmVha2NoZWNrKCk7CisJfQorCWVsc2UKKwl7CisKKwkgICAgLyogRG8gb25lIG1vcmUgYnl0ZSBhdCB0aGlzIG5vZGUuICovCisJICAgIG4gPSBhcnJpZHhbZGVwdGhdICsgY3VyaVtkZXB0aF07CisJICAgICsrY3VyaVtkZXB0aF07CisKKwkgICAgYyA9IGJ5dHNbbl07CisJICAgIGlmIChjID09IDApCisJICAgIHsKKwkJLyogU291bmQtZm9sZCB0aGUgd29yZC4gKi8KKwkJdHdvcmRbZGVwdGhdID0gTlVMOworCQlzcGVsbF9zb3VuZGZvbGQoc2xhbmcsIHR3b3JkLCBUUlVFLCB0c2Fsd29yZCk7CisKKwkJLyogV2UgdXNlIHRoZSAiZmxhZ3MiIGZpZWxkIGZvciB0aGUgTVNCIG9mIHRoZSB3b3JkbnIsCisJCSAqICJyZWdpb24iIGZvciB0aGUgTFNCIG9mIHRoZSB3b3JkbnIuICAqLworCQlpZiAodHJlZV9hZGRfd29yZChzcGluLCB0c2Fsd29yZCwgc3Bpbi0+c2lfZm9sZHJvb3QsCisJCQkJd29yZHNfZG9uZSA+PiAxNiwgd29yZHNfZG9uZSAmIDB4ZmZmZiwKKwkJCQkJCQkgICAwKSA9PSBGQUlMKQorCQkgICAgcmV0dXJuIEZBSUw7CisKKwkJKyt3b3Jkc19kb25lOworCQkrK3dvcmRjb3VudFtkZXB0aF07CisKKwkJLyogUmVzZXQgdGhlIGJsb2NrIGNvdW50IGVhY2ggdGltZSB0byBhdm9pZCBjb21wcmVzc2lvbgorCQkgKiBraWNraW5nIGluLiAqLworCQlzcGluLT5zaV9ibG9ja3NfY250ID0gMDsKKworCQkvKiBTa2lwIG92ZXIgYW55IG90aGVyIE5VTCBieXRlcyAoc2FtZSB3b3JkIHdpdGggZGlmZmVyZW50CisJCSAqIGZsYWdzKS4gKi8KKwkJd2hpbGUgKGJ5dHNbbiArIDFdID09IDApCisJCXsKKwkJICAgICsrbjsKKwkJICAgICsrY3VyaVtkZXB0aF07CisJCX0KKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJLyogTm9ybWFsIGNoYXIsIGdvIG9uZSBsZXZlbCBkZWVwZXIuICovCisJCXR3b3JkW2RlcHRoKytdID0gYzsKKwkJYXJyaWR4W2RlcHRoXSA9IGlkeHNbbl07CisJCWN1cmlbZGVwdGhdID0gMTsKKwkJd29yZGNvdW50W2RlcHRoXSA9IDA7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgc21zZygoY2hhcl91ICopXygiVG90YWwgbnVtYmVyIG9mIHdvcmRzOiAlZCIpLCB3b3Jkc19kb25lKTsKKworICAgIHJldHVybiBPSzsKK30KKworLyoKKyAqIE1ha2UgdGhlIHRhYmxlIHRoYXQgbGlua3MgZWFjaCB3b3JkIGluIHRoZSBzb3VuZGZvbGQgdHJpZSB0byB0aGUgd29yZHMgaXQKKyAqIGNhbiBiZSBwcm9kdWNlZCBmcm9tLgorICogVGhpcyBpcyBub3QgdW5saWtlIGxpbmVzIGluIGEgZmlsZSwgdGh1cyB1c2UgYSBtZW1maWxlIHRvIGJlIGFibGUgdG8gYWNjZXNzCisgKiB0aGUgdGFibGUgZWZmaWNpZW50bHkuCisgKiBSZXR1cm5zIEZBSUwgd2hlbiBvdXQgb2YgbWVtb3J5LgorICovCisgICAgc3RhdGljIGludAorc3VnX21ha2V0YWJsZShzcGluKQorICAgIHNwZWxsaW5mb19UCSpzcGluOworeworICAgIGdhcnJheV9UCWdhOworICAgIGludAkJcmVzID0gT0s7CisKKyAgICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciwgb3BlbiBhIG1lbWxpbmUgZm9yIGl0IGFuZCBjcmVhdGUgdGhlIHN3YXAgZmlsZQorICAgICAqICh1c2VzIGEgdGVtcCBmaWxlLCBub3QgYSAuc3dwIGZpbGUpLiAqLworICAgIHNwaW4tPnNpX3NwZWxsYnVmID0gb3Blbl9zcGVsbGJ1ZigpOworICAgIGlmIChzcGluLT5zaV9zcGVsbGJ1ZiA9PSBOVUxMKQorCXJldHVybiBGQUlMOworCisgICAgLyogVXNlIGEgYnVmZmVyIHRvIHN0b3JlIHRoZSBsaW5lIGluZm8sIGF2b2lkcyBhbGxvY2F0aW5nIG1hbnkgc21hbGwKKyAgICAgKiBwaWVjZXMgb2YgbWVtb3J5LiAqLworICAgIGdhX2luaXQyKCZnYSwgMSwgMTAwKTsKKworICAgIC8qIHJlY3Vyc2l2ZWx5IGdvIHRocm91Z2ggdGhlIHRyZWUgKi8KKyAgICBpZiAoc3VnX2ZpbGx0YWJsZShzcGluLCBzcGluLT5zaV9mb2xkcm9vdC0+d25fc2libGluZywgMCwgJmdhKSA9PSAtMSkKKwlyZXMgPSBGQUlMOworCisgICAgZ2FfY2xlYXIoJmdhKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKgorICogRmlsbCB0aGUgdGFibGUgZm9yIG9uZSBub2RlIGFuZCBpdHMgY2hpbGRyZW4uCisgKiBSZXR1cm5zIHRoZSB3b3JkbnIgYXQgdGhlIHN0YXJ0IG9mIHRoZSBub2RlLgorICogUmV0dXJucyAtMSB3aGVuIG91dCBvZiBtZW1vcnkuCisgKi8KKyAgICBzdGF0aWMgaW50CitzdWdfZmlsbHRhYmxlKHNwaW4sIG5vZGUsIHN0YXJ0d29yZG5yLCBnYXApCisgICAgc3BlbGxpbmZvX1QJKnNwaW47CisgICAgd29yZG5vZGVfVAkqbm9kZTsKKyAgICBpbnQJCXN0YXJ0d29yZG5yOworICAgIGdhcnJheV9UCSpnYXA7CSAgICAvKiBwbGFjZSB0byBzdG9yZSBsaW5lIG9mIG51bWJlcnMgKi8KK3sKKyAgICB3b3Jkbm9kZV9UCSpwLCAqbnA7CisgICAgaW50CQl3b3JkbnIgPSBzdGFydHdvcmRucjsKKyAgICBpbnQJCW5yOworICAgIGludAkJcHJldl9ucjsKKworICAgIGZvciAocCA9IG5vZGU7IHAgIT0gTlVMTDsgcCA9IHAtPnduX3NpYmxpbmcpCisgICAgeworCWlmIChwLT53bl9ieXRlID09IE5VTCkKKwl7CisJICAgIGdhcC0+Z2FfbGVuID0gMDsKKwkgICAgcHJldl9uciA9IDA7CisJICAgIGZvciAobnAgPSBwOyBucCAhPSBOVUxMICYmIG5wLT53bl9ieXRlID09IE5VTDsgbnAgPSBucC0+d25fc2libGluZykKKwkgICAgeworCQlpZiAoZ2FfZ3JvdyhnYXAsIDEwKSA9PSBGQUlMKQorCQkgICAgcmV0dXJuIC0xOworCisJCW5yID0gKG5wLT53bl9mbGFncyA8PCAxNikgKyAobnAtPnduX3JlZ2lvbiAmIDB4ZmZmZik7CisJCS8qIENvbXB1dGUgdGhlIG9mZnNldCBmcm9tIHRoZSBwcmV2aW91cyBuciBhbmQgc3RvcmUgdGhlCisJCSAqIG9mZnNldCBpbiBhIHdheSB0aGF0IGl0IHRha2VzIGEgbWluaW11bSBudW1iZXIgb2YgYnl0ZXMuCisJCSAqIEl0J3MgYSBiaXQgbGlrZSB1dGYtOCwgYnV0IHdpdGhvdXQgdGhlIG5lZWQgdG8gbWFyaworCQkgKiBmb2xsb3dpbmcgYnl0ZXMuICovCisJCW5yIC09IHByZXZfbnI7CisJCXByZXZfbnIgKz0gbnI7CisJCWdhcC0+Z2FfbGVuICs9IG9mZnNldDJieXRlcyhuciwKKwkJCQkJIChjaGFyX3UgKilnYXAtPmdhX2RhdGEgKyBnYXAtPmdhX2xlbik7CisJICAgIH0KKworCSAgICAvKiBhZGQgdGhlIE5VTCBieXRlICovCisJICAgICgoY2hhcl91ICopZ2FwLT5nYV9kYXRhKVtnYXAtPmdhX2xlbisrXSA9IE5VTDsKKworCSAgICBpZiAobWxfYXBwZW5kX2J1ZihzcGluLT5zaV9zcGVsbGJ1ZiwgKGxpbmVucl9UKXdvcmRuciwKKwkJCQkgICAgIGdhcC0+Z2FfZGF0YSwgZ2FwLT5nYV9sZW4sIFRSVUUpID09IEZBSUwpCisJCXJldHVybiAtMTsKKwkgICAgKyt3b3JkbnI7CisKKwkgICAgLyogUmVtb3ZlIGV4dHJhIE5VTCBlbnRyaWVzLCB3ZSBubyBsb25nZXIgbmVlZCB0aGVtLiBXZSBkb24ndAorCSAgICAgKiBib3RoZXIgZnJlZWluZyB0aGUgbm9kZXMsIHRoZSB3b24ndCBiZSByZXVzZWQgYW55d2F5LiAqLworCSAgICB3aGlsZSAocC0+d25fc2libGluZyAhPSBOVUxMICYmIHAtPnduX3NpYmxpbmctPnduX2J5dGUgPT0gTlVMKQorCQlwLT53bl9zaWJsaW5nID0gcC0+d25fc2libGluZy0+d25fc2libGluZzsKKworCSAgICAvKiBDbGVhciB0aGUgZmxhZ3Mgb24gdGhlIHJlbWFpbmluZyBOVUwgbm9kZSwgc28gdGhhdCBjb21wcmVzc2lvbgorCSAgICAgKiB3b3JrcyBhIGxvdCBiZXR0ZXIuICovCisJICAgIHAtPnduX2ZsYWdzID0gMDsKKwkgICAgcC0+d25fcmVnaW9uID0gMDsKKwl9CisJZWxzZQorCXsKKwkgICAgd29yZG5yID0gc3VnX2ZpbGx0YWJsZShzcGluLCBwLT53bl9jaGlsZCwgd29yZG5yLCBnYXApOworCSAgICBpZiAod29yZG5yID09IC0xKQorCQlyZXR1cm4gLTE7CisJfQorICAgIH0KKyAgICByZXR1cm4gd29yZG5yOworfQorCisvKgorICogQ29udmVydCBhbiBvZmZzZXQgaW50byBhIG1pbmltYWwgbnVtYmVyIG9mIGJ5dGVzLgorICogU2ltaWxhciB0byB1dGZfY2hhcjJieXRlcnMsIGJ1dCB1c2UgOCBiaXRzIGluIGZvbGxvd3VwIGJ5dGVzIGFuZCBhdm9pZCBOVUwKKyAqIGJ5dGVzLgorICovCisgICAgc3RhdGljIGludAorb2Zmc2V0MmJ5dGVzKG5yLCBidWYpCisgICAgaW50CSAgICBucjsKKyAgICBjaGFyX3UgICpidWY7Cit7CisgICAgaW50CSAgICByZW07CisgICAgaW50CSAgICBiMSwgYjIsIGIzLCBiNDsKKworICAgIC8qIFNwbGl0IHRoZSBudW1iZXIgaW4gcGFydHMgb2YgYmFzZSAyNTUuICBXZSBuZWVkIHRvIGF2b2lkIE5VTCBieXRlcy4gKi8KKyAgICBiMSA9IG5yICUgMjU1ICsgMTsKKyAgICByZW0gPSBuciAvIDI1NTsKKyAgICBiMiA9IHJlbSAlIDI1NSArIDE7CisgICAgcmVtID0gcmVtIC8gMjU1OworICAgIGIzID0gcmVtICUgMjU1ICsgMTsKKyAgICBiNCA9IHJlbSAvIDI1NSArIDE7CisKKyAgICBpZiAoYjQgPiAxIHx8IGIzID4gMHgxZikJLyogNCBieXRlcyAqLworICAgIHsKKwlidWZbMF0gPSAweGUwICsgYjQ7CisJYnVmWzFdID0gYjM7CisJYnVmWzJdID0gYjI7CisJYnVmWzNdID0gYjE7CisJcmV0dXJuIDQ7CisgICAgfQorICAgIGlmIChiMyA+IDEgfHwgYjIgPiAweDNmICkJLyogMyBieXRlcyAqLworICAgIHsKKwlidWZbMF0gPSAweGMwICsgYjM7CisJYnVmWzFdID0gYjI7CisJYnVmWzJdID0gYjE7CisJcmV0dXJuIDM7CisgICAgfQorICAgIGlmIChiMiA+IDEgfHwgYjEgPiAweDdmICkJLyogMiBieXRlcyAqLworICAgIHsKKwlidWZbMF0gPSAweDgwICsgYjI7CisJYnVmWzFdID0gYjE7CisJcmV0dXJuIDI7CisgICAgfQorCQkJCS8qIDEgYnl0ZSAqLworICAgIGJ1ZlswXSA9IGIxOworICAgIHJldHVybiAxOworfQorCisvKgorICogT3Bwb3NpdGUgb2Ygb2Zmc2V0MmJ5dGVzKCkuCisgKiAicHAiIHBvaW50cyB0byB0aGUgYnl0ZXMgYW5kIGlzIGFkdmFuY2VkIG92ZXIgaXQuCisgKiBSZXR1cm5zIHRoZSBvZmZzZXQuCisgKi8KKyAgICBzdGF0aWMgaW50CitieXRlczJvZmZzZXQocHApCisgICAgY2hhcl91CSoqcHA7Cit7CisgICAgY2hhcl91CSpwID0gKnBwOworICAgIGludAkJbnI7CisgICAgaW50CQljOworCisgICAgYyA9ICpwKys7CisgICAgaWYgKChjICYgMHg4MCkgPT0gMHgwMCkJCS8qIDEgYnl0ZSAqLworICAgIHsKKwluciA9IGMgLSAxOworICAgIH0KKyAgICBlbHNlIGlmICgoYyAmIDB4YzApID09IDB4ODApCS8qIDIgYnl0ZXMgKi8KKyAgICB7CisJbnIgPSAoYyAmIDB4M2YpIC0gMTsKKwluciA9IG5yICogMjU1ICsgKCpwKysgLSAxKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKGMgJiAweGUwKSA9PSAweGMwKQkvKiAzIGJ5dGVzICovCisgICAgeworCW5yID0gKGMgJiAweDFmKSAtIDE7CisJbnIgPSBuciAqIDI1NSArICgqcCsrIC0gMSk7CisJbnIgPSBuciAqIDI1NSArICgqcCsrIC0gMSk7CisgICAgfQorICAgIGVsc2UJCQkJLyogNCBieXRlcyAqLworICAgIHsKKwluciA9IChjICYgMHgwZikgLSAxOworCW5yID0gbnIgKiAyNTUgKyAoKnArKyAtIDEpOworCW5yID0gbnIgKiAyNTUgKyAoKnArKyAtIDEpOworCW5yID0gbnIgKiAyNTUgKyAoKnArKyAtIDEpOworICAgIH0KKworICAgICpwcCA9IHA7CisgICAgcmV0dXJuIG5yOworfQorCisvKgorICogV3JpdGUgdGhlIC5zdWcgZmlsZSBpbiAiZm5hbWUiLgorICovCisgICAgc3RhdGljIHZvaWQKK3N1Z193cml0ZShzcGluLCBmbmFtZSkKKyAgICBzcGVsbGluZm9fVAkqc3BpbjsKKyAgICBjaGFyX3UJKmZuYW1lOworeworICAgIEZJTEUJKmZkOworICAgIHdvcmRub2RlX1QJKnRyZWU7CisgICAgaW50CQlub2RlY291bnQ7CisgICAgaW50CQl3Y291bnQ7CisgICAgY2hhcl91CSpsaW5lOworICAgIGxpbmVucl9UCWxudW07CisgICAgaW50CQlsZW47CisKKyAgICAvKiBDcmVhdGUgdGhlIGZpbGUuICBOb3RlIHRoYXQgYW4gZXhpc3RpbmcgZmlsZSBpcyBzaWxlbnRseSBvdmVyd3JpdHRlbiEgKi8KKyAgICBmZCA9IG1jaF9mb3BlbigoY2hhciAqKWZuYW1lLCAidyIpOworICAgIGlmIChmZCA9PSBOVUxMKQorICAgIHsKKwlFTVNHMihfKGVfbm90b3BlbiksIGZuYW1lKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgdmltX3NucHJpbnRmKChjaGFyICopSU9idWZmLCBJT1NJWkUsCisJCQkJICBfKCJXcml0aW5nIHN1Z2dlc3Rpb24gZmlsZSAlcyAuLi4iKSwgZm5hbWUpOworICAgIHNwZWxsX21lc3NhZ2Uoc3BpbiwgSU9idWZmKTsKKworICAgIC8qCisgICAgICogPFNVR0hFQURFUj46IDxmaWxlSUQ+IDx2ZXJzaW9ubnI+IDx0aW1lc3RhbXA+CisgICAgICovCisgICAgaWYgKGZ3cml0ZShWSU1TVUdNQUdJQywgVklNU1VHTUFHSUNMLCAoc2l6ZV90KTEsIGZkKSAhPSAxKSAvKiA8ZmlsZUlEPiAqLworICAgIHsKKwlFTVNHKF8oZV93cml0ZSkpOworCWdvdG8gdGhlZW5kOworICAgIH0KKyAgICBwdXRjKFZJTVNVR1ZFUlNJT04sIGZkKTsJCQkJLyogPHZlcnNpb25ucj4gKi8KKworICAgIC8qIFdyaXRlIHNpX3N1Z3RpbWUgdG8gdGhlIGZpbGUuICovCisgICAgcHV0X3N1Z3RpbWUoc3BpbiwgZmQpOwkJCQkvKiA8dGltZXN0YW1wPiAqLworCisgICAgLyoKKyAgICAgKiA8U1VHV09SRFRSRUU+CisgICAgICovCisgICAgc3Bpbi0+c2lfbWVtdG90ID0gMDsKKyAgICB0cmVlID0gc3Bpbi0+c2lfZm9sZHJvb3QtPnduX3NpYmxpbmc7CisKKyAgICAvKiBDbGVhciB0aGUgaW5kZXggYW5kIHdub2RlIGZpZWxkcyBpbiB0aGUgdHJlZS4gKi8KKyAgICBjbGVhcl9ub2RlKHRyZWUpOworCisgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBub2Rlcy4gIE5lZWRlZCB0byBiZSBhYmxlIHRvIGFsbG9jYXRlIHRoZQorICAgICAqIG1lbW9yeSB3aGVuIHJlYWRpbmcgdGhlIG5vZGVzLiAgQWxzbyBmaWxscyBpbiBpbmRleCBmb3Igc2hhcmVkCisgICAgICogbm9kZXMuICovCisgICAgbm9kZWNvdW50ID0gcHV0X25vZGUoTlVMTCwgdHJlZSwgMCwgMCwgRkFMU0UpOworCisgICAgLyogbnVtYmVyIG9mIG5vZGVzIGluIDQgYnl0ZXMgKi8KKyAgICBwdXRfYnl0ZXMoZmQsIChsb25nX3Upbm9kZWNvdW50LCA0KTsJLyogPG5vZGVjb3VudD4gKi8KKyAgICBzcGluLT5zaV9tZW10b3QgKz0gbm9kZWNvdW50ICsgbm9kZWNvdW50ICogc2l6ZW9mKGludCk7CisKKyAgICAvKiBXcml0ZSB0aGUgbm9kZXMuICovCisgICAgKHZvaWQpcHV0X25vZGUoZmQsIHRyZWUsIDAsIDAsIEZBTFNFKTsKKworICAgIC8qCisgICAgICogPFNVR1RBQkxFPjogPHN1Z3djb3VudD4gPHN1Z2xpbmU+IC4uLgorICAgICAqLworICAgIHdjb3VudCA9IHNwaW4tPnNpX3NwZWxsYnVmLT5iX21sLm1sX2xpbmVfY291bnQ7CisgICAgcHV0X2J5dGVzKGZkLCAobG9uZ191KXdjb3VudCwgNCk7CS8qIDxzdWd3Y291bnQ+ICovCisKKyAgICBmb3IgKGxudW0gPSAxOyBsbnVtIDw9IChsaW5lbnJfVCl3Y291bnQ7ICsrbG51bSkKKyAgICB7CisJLyogPHN1Z2xpbmU+OiA8c3VnbnI+IC4uLiBOVUwgKi8KKwlsaW5lID0gbWxfZ2V0X2J1ZihzcGluLT5zaV9zcGVsbGJ1ZiwgbG51bSwgRkFMU0UpOworCWxlbiA9IFNUUkxFTihsaW5lKSArIDE7CisJaWYgKGZ3cml0ZShsaW5lLCAoc2l6ZV90KWxlbiwgKHNpemVfdCkxLCBmZCkgPT0gMCkKKwl7CisJICAgIEVNU0coXyhlX3dyaXRlKSk7CisJICAgIGdvdG8gdGhlZW5kOworCX0KKwlzcGluLT5zaV9tZW10b3QgKz0gbGVuOworICAgIH0KKworICAgIC8qIFdyaXRlIGFub3RoZXIgYnl0ZSB0byBjaGVjayBmb3IgZXJyb3JzLiAqLworICAgIGlmIChwdXRjKDAsIGZkKSA9PSBFT0YpCisJRU1TRyhfKGVfd3JpdGUpKTsKKworICAgIHZpbV9zbnByaW50ZigoY2hhciAqKUlPYnVmZiwgSU9TSVpFLAorCQkgXygiRXN0aW1hdGVkIHJ1bnRpbWUgbWVtb3J5IHVzZTogJWQgYnl0ZXMiKSwgc3Bpbi0+c2lfbWVtdG90KTsKKyAgICBzcGVsbF9tZXNzYWdlKHNwaW4sIElPYnVmZik7CisKK3RoZWVuZDoKKyAgICAvKiBjbG9zZSB0aGUgZmlsZSAqLworICAgIGZjbG9zZShmZCk7Cit9CisKKy8qCisgKiBPcGVuIGEgc3BlbGwgYnVmZmVyLiAgVGhpcyBpcyBhIG5hbWVsZXNzIGJ1ZmZlciB0aGF0IGlzIG5vdCBpbiB0aGUgYnVmZmVyCisgKiBsaXN0IGFuZCBvbmx5IGNvbnRhaW5zIHRleHQgbGluZXMuICBDYW4gdXNlIGEgc3dhcGZpbGUgdG8gcmVkdWNlIG1lbW9yeQorICogdXNlLgorICogTW9zdCBvdGhlciBmaWVsZHMgYXJlIGludmFsaWQhICBFc3AuIHdhdGNoIG91dCBmb3Igc3RyaW5nIG9wdGlvbnMgYmVpbmcKKyAqIE5VTEwgYW5kIHRoZXJlIGlzIG5vIHVuZG8gaW5mby4KKyAqIFJldHVybnMgTlVMTCB3aGVuIG91dCBvZiBtZW1vcnkuCisgKi8KKyAgICBzdGF0aWMgYnVmX1QgKgorb3Blbl9zcGVsbGJ1ZigpCit7CisgICAgYnVmX1QJKmJ1ZjsKKworICAgIGJ1ZiA9IChidWZfVCAqKWFsbG9jX2NsZWFyKHNpemVvZihidWZfVCkpOworICAgIGlmIChidWYgIT0gTlVMTCkKKyAgICB7CisJYnVmLT5iX3NwZWxsID0gVFJVRTsKKwlidWYtPmJfcF9zd2YgPSBUUlVFOwkvKiBtYXkgY3JlYXRlIGEgc3dhcCBmaWxlICovCisJbWxfb3BlbihidWYpOworCW1sX29wZW5fZmlsZShidWYpOwkvKiBjcmVhdGUgc3dhcCBmaWxlIG5vdyAqLworICAgIH0KKyAgICByZXR1cm4gYnVmOworfQorCisvKgorICogQ2xvc2UgdGhlIGJ1ZmZlciB1c2VkIGZvciBzcGVsbCBpbmZvLgorICovCisgICAgc3RhdGljIHZvaWQKK2Nsb3NlX3NwZWxsYnVmKGJ1ZikKKyAgICBidWZfVAkqYnVmOworeworICAgIGlmIChidWYgIT0gTlVMTCkKKyAgICB7CisJbWxfY2xvc2UoYnVmLCBUUlVFKTsKKwl2aW1fZnJlZShidWYpOworICAgIH0KK30KKworCisvKgogICogQ3JlYXRlIGEgVmltIHNwZWxsIGZpbGUgZnJvbSBvbmUgb3IgbW9yZSB3b3JkIGxpc3RzLgogICogImZuYW1lc1swXSIgaXMgdGhlIG91dHB1dCBmaWxlIG5hbWUuCiAgKiAiZm5hbWVzW2Zjb3VudCAtIDFdIiBpcyB0aGUgbGFzdCBpbnB1dCBmaWxlIG5hbWUuCkBAIC03NDU4LDkgKzgzOTAsMTEgQEAKICAgICBzcGluLnNpX2ZvbGxvd3VwID0gVFJVRTsKICAgICBzcGluLnNpX3JlbV9hY2NlbnRzID0gVFJVRTsKICAgICBnYV9pbml0Migmc3Bpbi5zaV9yZXAsIChpbnQpc2l6ZW9mKGZyb210b19UKSwgMjApOworICAgIGdhX2luaXQyKCZzcGluLnNpX3JlcHNhbCwgKGludClzaXplb2YoZnJvbXRvX1QpLCAyMCk7CiAgICAgZ2FfaW5pdDIoJnNwaW4uc2lfc2FsLCAoaW50KXNpemVvZihmcm9tdG9fVCksIDIwKTsKICAgICBnYV9pbml0Migmc3Bpbi5zaV9tYXAsIChpbnQpc2l6ZW9mKGNoYXJfdSksIDEwMCk7CiAgICAgZ2FfaW5pdDIoJnNwaW4uc2lfcHJlZmNvbmQsIChpbnQpc2l6ZW9mKGNoYXJfdSAqKSwgNTApOworICAgIGhhc2hfaW5pdCgmc3Bpbi5zaV9jb21tb253b3Jkcyk7CiAgICAgc3Bpbi5zaV9uZXdjb21wSUQgPSAxMjc7CS8qIHN0YXJ0IGNvbXBvdW5kIElEIGF0IGZpcnN0IG1heGltdW0gKi8KIAogICAgIC8qIGRlZmF1bHQ6IGZuYW1lc1swXSBpcyBvdXRwdXQgZmlsZSwgZm9sbG93aW5nIGFyZSBpbnB1dCBmaWxlcyAqLwpAQCAtNzYxMyw2NCArODU0Nyw0NyBAQAogCWlmIChzcGluLnNpX2NvbXBmbGFncyAhPSBOVUxMICYmIHNwaW4uc2lfbm9icmVhaykKIAkgICAgTVNHKF8oIldhcm5pbmc6IGJvdGggY29tcG91bmRpbmcgYW5kIE5PQlJFQUsgc3BlY2lmaWVkIikpOwogCi0JaWYgKCFlcnJvcikKKwlpZiAoIWVycm9yICYmICFnb3RfaW50KQogCXsKIAkgICAgLyoKIAkgICAgICogQ29tYmluZSB0YWlscyBpbiB0aGUgdHJlZS4KIAkgICAgICovCi0JICAgIGlmIChzcGluLnNpX3ZlcmJvc2UgfHwgcF92ZXJib3NlID4gMikKLQkgICAgewotCQlpZiAoIXNwaW4uc2lfdmVyYm9zZSkKLQkJICAgIHZlcmJvc2VfZW50ZXIoKTsKLQkJTVNHKF8obXNnX2NvbXByZXNzaW5nKSk7Ci0JCW91dF9mbHVzaCgpOwotCQlpZiAoIXNwaW4uc2lfdmVyYm9zZSkKLQkJICAgIHZlcmJvc2VfbGVhdmUoKTsKLQkgICAgfQorCSAgICBzcGVsbF9tZXNzYWdlKCZzcGluLCAoY2hhcl91ICopXyhtc2dfY29tcHJlc3NpbmcpKTsKIAkgICAgd29yZHRyZWVfY29tcHJlc3MoJnNwaW4sIHNwaW4uc2lfZm9sZHJvb3QpOwogCSAgICB3b3JkdHJlZV9jb21wcmVzcygmc3Bpbiwgc3Bpbi5zaV9rZWVwcm9vdCk7CiAJICAgIHdvcmR0cmVlX2NvbXByZXNzKCZzcGluLCBzcGluLnNpX3ByZWZyb290KTsKIAl9CiAKLQlpZiAoIWVycm9yKQorCWlmICghZXJyb3IgJiYgIWdvdF9pbnQpCiAJewogCSAgICAvKgogCSAgICAgKiBXcml0ZSB0aGUgaW5mbyBpbiB0aGUgc3BlbGwgZmlsZS4KIAkgICAgICovCi0JICAgIGlmIChzcGluLnNpX3ZlcmJvc2UgfHwgcF92ZXJib3NlID4gMikKLQkgICAgewotCQlpZiAoIXNwaW4uc2lfdmVyYm9zZSkKLQkJICAgIHZlcmJvc2VfZW50ZXIoKTsKLQkJc21zZygoY2hhcl91ICopXygiV3JpdGluZyBzcGVsbCBmaWxlICVzIC4uLiIpLCB3Zm5hbWUpOwotCQlvdXRfZmx1c2goKTsKLQkJaWYgKCFzcGluLnNpX3ZlcmJvc2UpCi0JCSAgICB2ZXJib3NlX2xlYXZlKCk7Ci0JICAgIH0KKwkgICAgdmltX3NucHJpbnRmKChjaGFyICopSU9idWZmLCBJT1NJWkUsCisJCQkJICAgICAgXygiV3JpdGluZyBzcGVsbCBmaWxlICVzIC4uLiIpLCB3Zm5hbWUpOworCSAgICBzcGVsbF9tZXNzYWdlKCZzcGluLCBJT2J1ZmYpOwogCiAJICAgIGVycm9yID0gd3JpdGVfdmltX3NwZWxsKCZzcGluLCB3Zm5hbWUpID09IEZBSUw7CiAKLQkgICAgaWYgKHNwaW4uc2lfdmVyYm9zZSB8fCBwX3ZlcmJvc2UgPiAyKQotCSAgICB7Ci0JCWlmICghc3Bpbi5zaV92ZXJib3NlKQotCQkgICAgdmVyYm9zZV9lbnRlcigpOwotCQlNU0coXygiRG9uZSEiKSk7Ci0JCXNtc2coKGNoYXJfdSAqKV8oIkVzdGltYXRlZCBydW50aW1lIG1lbW9yeSB1c2U6ICVkIGJ5dGVzIiksCi0JCQkJCQkJICAgICAgc3Bpbi5zaV9tZW10b3QpOwotCQlvdXRfZmx1c2goKTsKLQkJaWYgKCFzcGluLnNpX3ZlcmJvc2UpCi0JCSAgICB2ZXJib3NlX2xlYXZlKCk7Ci0JICAgIH0KKwkgICAgc3BlbGxfbWVzc2FnZSgmc3BpbiwgKGNoYXJfdSAqKV8oIkRvbmUhIikpOworCSAgICB2aW1fc25wcmludGYoKGNoYXIgKilJT2J1ZmYsIElPU0laRSwKKwkJIF8oIkVzdGltYXRlZCBydW50aW1lIG1lbW9yeSB1c2U6ICVkIGJ5dGVzIiksIHNwaW4uc2lfbWVtdG90KTsKKwkgICAgc3BlbGxfbWVzc2FnZSgmc3BpbiwgSU9idWZmKTsKIAotCSAgICAvKiBJZiB0aGUgZmlsZSBpcyBsb2FkZWQgbmVlZCB0byByZWxvYWQgaXQuICovCisJICAgIC8qCisJICAgICAqIElmIHRoZSBmaWxlIGlzIGxvYWRlZCBuZWVkIHRvIHJlbG9hZCBpdC4KKwkgICAgICovCiAJICAgIGlmICghZXJyb3IpCiAJCXNwZWxsX3JlbG9hZF9vbmUod2ZuYW1lLCBhZGRlZF93b3JkKTsKIAl9CiAKIAkvKiBGcmVlIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LiAqLwogCWdhX2NsZWFyKCZzcGluLnNpX3JlcCk7CisJZ2FfY2xlYXIoJnNwaW4uc2lfcmVwc2FsKTsKIAlnYV9jbGVhcigmc3Bpbi5zaV9zYWwpOwogCWdhX2NsZWFyKCZzcGluLnNpX21hcCk7CiAJZ2FfY2xlYXIoJnNwaW4uc2lfcHJlZmNvbmQpOworCWhhc2hfY2xlYXJfYWxsKCZzcGluLnNpX2NvbW1vbndvcmRzLCAwKTsKIAogCS8qIEZyZWUgdGhlIC5hZmYgZmlsZSBzdHJ1Y3R1cmVzLiAqLwogCWZvciAoaSA9IDA7IGkgPCBpbmNvdW50OyArK2kpCkBAIC03Njc5LDkgKzg1OTYsMzYgQEAKIAogCS8qIEZyZWUgYWxsIHRoZSBiaXRzIGFuZCBwaWVjZXMgYXQgb25jZS4gKi8KIAlmcmVlX2Jsb2NrcyhzcGluLnNpX2Jsb2Nrcyk7CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIHNvdW5kZm9sZGluZyBpbmZvIGFuZCBubyBOT1NVR0ZJTEUgaXRlbSBjcmVhdGUgdGhlCisJICogLnN1ZyBmaWxlIHdpdGggdGhlIHNvdW5kZm9sZGVkIHdvcmQgdHJpZS4KKwkgKi8KKwlpZiAoc3Bpbi5zaV9zdWd0aW1lICE9IDAgJiYgIWVycm9yICYmICFnb3RfaW50KQorCSAgICBzcGVsbF9tYWtlX3N1Z2ZpbGUoJnNwaW4sIHdmbmFtZSk7CisKICAgICB9CiB9CiAKKy8qCisgKiBEaXNwbGF5IGEgbWVzc2FnZSBmb3Igc3BlbGwgZmlsZSBwcm9jZXNzaW5nIHdoZW4gJ3ZlcmJvc2UnIGlzIHNldCBvciB1c2luZworICogIjpta3NwZWxsIi4gICJzdHIiIGNhbiBiZSBJT2J1ZmYuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc3BlbGxfbWVzc2FnZShzcGluLCBzdHIpCisgICAgc3BlbGxpbmZvX1QgKnNwaW47CisgICAgY2hhcl91CSpzdHI7Cit7CisgICAgaWYgKHNwaW4tPnNpX3ZlcmJvc2UgfHwgcF92ZXJib3NlID4gMikKKyAgICB7CisJaWYgKCFzcGluLT5zaV92ZXJib3NlKQorCSAgICB2ZXJib3NlX2VudGVyKCk7CisJTVNHKHN0cik7CisJb3V0X2ZsdXNoKCk7CisJaWYgKCFzcGluLT5zaV92ZXJib3NlKQorCSAgICB2ZXJib3NlX2xlYXZlKCk7CisgICAgfQorfQogCiAvKgogICogIjpbY291bnRdc3BlbGxnb29kICB7d29yZH0iCkBAIC04MzM0LDEyICs5Mjc4LDEzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCisvKiB2YWx1ZXMgZm9yIHNwc19mbGFncyAqLwogI2RlZmluZSBTUFNfQkVTVCAgICAxCiAjZGVmaW5lIFNQU19GQVNUICAgIDIKICNkZWZpbmUgU1BTX0RPVUJMRSAgNAogCi1zdGF0aWMgaW50IHNwc19mbGFncyA9IFNQU19CRVNUOwotc3RhdGljIGludCBzcHNfbGltaXQgPSA5OTk5Oworc3RhdGljIGludCBzcHNfZmxhZ3MgPSBTUFNfQkVTVDsJLyogZmxhZ3MgZnJvbSAnc3BlbGxzdWdnZXN0JyAqLworc3RhdGljIGludCBzcHNfbGltaXQgPSA5OTk5OwkJLyogbWF4IG5yIG9mIHN1Z2dlc3Rpb25zIGdpdmVuICovCiAKIC8qCiAgKiBDaGVjayB0aGUgJ3NwZWxsc3VnZ2VzdCcgb3B0aW9uLiAgUmV0dXJuIEZBSUwgaWYgaXQncyB3cm9uZy4KQEAgLTg0NjEsNyArOTQwNiw3IEBACiAgICAgZWxzZQogCWxpbWl0ID0gc3BzX2xpbWl0OwogICAgIHNwZWxsX2ZpbmRfc3VnZ2VzdChsaW5lICsgY3Vyd2luLT53X2N1cnNvci5jb2wsICZzdWcsIGxpbWl0LAotCQkJCQkJCSAgICAgIFRSVUUsIG5lZWRfY2FwKTsKKwkJCQkJCQlUUlVFLCBuZWVkX2NhcCwgVFJVRSk7CiAKICAgICBpZiAoc3VnLnN1X2dhLmdhX2xlbiA9PSAwKQogCU1TRyhfKCJTb3JyeSwgbm8gc3VnZ2VzdGlvbnMiKSk7CkBAIC04NTEyLDcgKzk0NTcsNyBAQAogCSAgICAgKiB0aGUgbm90IHJlcGxhY2VkIHBhcnQuICovCiAJICAgIFNUUkNQWSh3Y29weSwgc3RwLT5zdF93b3JkKTsKIAkgICAgaWYgKHN1Zy5zdV9iYWRsZW4gPiBzdHAtPnN0X29yZ2xlbikKLQkJdmltX3N0cm5jcHkod2NvcHkgKyBTVFJMRU4od2NvcHkpLAorCQl2aW1fc3RybmNweSh3Y29weSArIHN0cC0+c3Rfd29yZGxlbiwKIAkJCQkJICAgICAgIHN1Zy5zdV9iYWRwdHIgKyBzdHAtPnN0X29yZ2xlbiwKIAkJCQkJICAgICAgc3VnLnN1X2JhZGxlbiAtIHN0cC0+c3Rfb3JnbGVuKTsKIAkgICAgdmltX3NucHJpbnRmKChjaGFyICopSU9idWZmLCBJT1NJWkUsICIlMmQiLCBpICsgMSk7CkBAIC04NTg2LDcgKzk1MzEsNyBAQAogCX0KIAogCS8qIFJlcGxhY2UgdGhlIHdvcmQuICovCi0JcCA9IGFsbG9jKFNUUkxFTihsaW5lKSAtIHN0cC0+c3Rfb3JnbGVuICsgU1RSTEVOKHN0cC0+c3Rfd29yZCkgKyAxKTsKKwlwID0gYWxsb2MoU1RSTEVOKGxpbmUpIC0gc3RwLT5zdF9vcmdsZW4gKyBzdHAtPnN0X3dvcmRsZW4gKyAxKTsKIAlpZiAocCAhPSBOVUxMKQogCXsKIAkgICAgYyA9IHN1Zy5zdV9iYWRwdHIgLSBsaW5lOwpAQCAtODYwMSw3ICs5NTQ2LDcgQEAKIAkgICAgUmVzZXRSZWRvYnVmZigpOwogCSAgICBBcHBlbmRUb1JlZG9idWZmKChjaGFyX3UgKikiY2l3Iik7CiAJICAgIEFwcGVuZFRvUmVkb2J1ZmZMaXQocCArIGMsCi0JCSAgICAgICBTVFJMRU4oc3RwLT5zdF93b3JkKSArIHN1Zy5zdV9iYWRsZW4gLSBzdHAtPnN0X29yZ2xlbik7CisJCQkgICAgc3RwLT5zdF93b3JkbGVuICsgc3VnLnN1X2JhZGxlbiAtIHN0cC0+c3Rfb3JnbGVuKTsKIAkgICAgQXBwZW5kQ2hhclRvUmVkb2J1ZmYoRVNDKTsKIAl9CiAgICAgfQpAQCAtODc1OSwxOCArOTcwNCwxOSBAQAogICogYSBsaXN0IG9mIGFsbG9jYXRlZCBzdHJpbmdzLgogICovCiAgICAgdm9pZAotc3BlbGxfc3VnZ2VzdF9saXN0KGdhcCwgd29yZCwgbWF4Y291bnQsIG5lZWRfY2FwKQorc3BlbGxfc3VnZ2VzdF9saXN0KGdhcCwgd29yZCwgbWF4Y291bnQsIG5lZWRfY2FwLCBpbnRlcmFjdGl2ZSkKICAgICBnYXJyYXlfVAkqZ2FwOwogICAgIGNoYXJfdQkqd29yZDsKICAgICBpbnQJCW1heGNvdW50OwkvKiBtYXhpbXVtIG5yIG9mIHN1Z2dlc3Rpb25zICovCiAgICAgaW50CQluZWVkX2NhcDsJLyogJ3NwZWxsY2FwY2hlY2snIG1hdGNoZWQgKi8KKyAgICBpbnQJCWludGVyYWN0aXZlOwogewogICAgIHN1Z2luZm9fVAlzdWc7CiAgICAgaW50CQlpOwogICAgIHN1Z2dlc3RfVAkqc3RwOwogICAgIGNoYXJfdQkqd2NvcHk7CiAKLSAgICBzcGVsbF9maW5kX3N1Z2dlc3Qod29yZCwgJnN1ZywgbWF4Y291bnQsIEZBTFNFLCBuZWVkX2NhcCk7CisgICAgc3BlbGxfZmluZF9zdWdnZXN0KHdvcmQsICZzdWcsIG1heGNvdW50LCBGQUxTRSwgbmVlZF9jYXAsIGludGVyYWN0aXZlKTsKIAogICAgIC8qIE1ha2Ugcm9vbSBpbiAiZ2FwIi4gKi8KICAgICBnYV9pbml0MihnYXAsIHNpemVvZihjaGFyX3UgKiksIHN1Zy5zdV9nYS5nYV9sZW4gKyAxKTsKQEAgLTg3ODMsMTIgKzk3MjksMTIgQEAKIAogCS8qIFRoZSBzdWdnZXN0ZWQgd29yZCBtYXkgcmVwbGFjZSBvbmx5IHBhcnQgb2YgIndvcmQiLCBhZGQgdGhlIG5vdAogCSAqIHJlcGxhY2VkIHBhcnQuICovCi0Jd2NvcHkgPSBhbGxvYyhTVFJMRU4oc3RwLT5zdF93b3JkKQorCXdjb3B5ID0gYWxsb2Moc3RwLT5zdF93b3JkbGVuCiAJCQkJKyBTVFJMRU4oc3VnLnN1X2JhZHB0ciArIHN0cC0+c3Rfb3JnbGVuKSArIDEpOwogCWlmICh3Y29weSA9PSBOVUxMKQogCSAgICBicmVhazsKIAlTVFJDUFkod2NvcHksIHN0cC0+c3Rfd29yZCk7Ci0JU1RSQ0FUKHdjb3B5LCBzdWcuc3VfYmFkcHRyICsgc3RwLT5zdF9vcmdsZW4pOworCVNUUkNQWSh3Y29weSArIHN0cC0+c3Rfd29yZGxlbiwgc3VnLnN1X2JhZHB0ciArIHN0cC0+c3Rfb3JnbGVuKTsKIAkoKGNoYXJfdSAqKilnYXAtPmdhX2RhdGEpW2dhcC0+Z2FfbGVuKytdID0gd2NvcHk7CiAgICAgfQogCkBAIC04ODAzLDEyICs5NzQ5LDEzIEBACiAgKiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBtZWNoYW5pc21zIG9mIEFzcGVsbCwgYnV0IGNvbXBsZXRlbHkgcmVpbXBsZW1lbnRlZC4KICAqLwogICAgIHN0YXRpYyB2b2lkCi1zcGVsbF9maW5kX3N1Z2dlc3QoYmFkcHRyLCBzdSwgbWF4Y291bnQsIGJhbmJhZHdvcmQsIG5lZWRfY2FwKQorc3BlbGxfZmluZF9zdWdnZXN0KGJhZHB0ciwgc3UsIG1heGNvdW50LCBiYW5iYWR3b3JkLCBuZWVkX2NhcCwgaW50ZXJhY3RpdmUpCiAgICAgY2hhcl91CSpiYWRwdHI7CiAgICAgc3VnaW5mb19UCSpzdTsKICAgICBpbnQJCW1heGNvdW50OwogICAgIGludAkJYmFuYmFkd29yZDsJLyogZG9uJ3QgaW5jbHVkZSBiYWR3b3JkIGluIHN1Z2dlc3Rpb25zICovCiAgICAgaW50CQluZWVkX2NhcDsJLyogd29yZCBzaG91bGQgc3RhcnQgd2l0aCBjYXBpdGFsICovCisgICAgaW50CQlpbnRlcmFjdGl2ZTsKIHsKICAgICBobGZfVAlhdHRyID0gSExGX0NPVU5UOwogICAgIGNoYXJfdQlidWZbTUFYUEFUSExdOwpAQCAtODgzMyw3ICs5NzgwLDcgQEAKICAgICBoYXNoX2luaXQoJnN1LT5zdV9iYW5uZWQpOwogCiAgICAgc3UtPnN1X2JhZHB0ciA9IGJhZHB0cjsKLSAgICBzdS0+c3VfYmFkbGVuID0gc3BlbGxfY2hlY2soY3Vyd2luLCBzdS0+c3VfYmFkcHRyLCAmYXR0ciwgTlVMTCk7CisgICAgc3UtPnN1X2JhZGxlbiA9IHNwZWxsX2NoZWNrKGN1cndpbiwgc3UtPnN1X2JhZHB0ciwgJmF0dHIsIE5VTEwsIEZBTFNFKTsKICAgICBzdS0+c3VfbWF4Y291bnQgPSBtYXhjb3VudDsKICAgICBzdS0+c3VfbWF4c2NvcmUgPSBTQ09SRV9NQVhJTklUOwogCkBAIC04ODc2LDcgKzk4MjMsNyBAQAogICAgIHsKIAltYWtlX2Nhc2Vfd29yZChzdS0+c3VfYmFkd29yZCwgYnVmLCBXRl9PTkVDQVApOwogCWFkZF9zdWdnZXN0aW9uKHN1LCAmc3UtPnN1X2dhLCBidWYsIHN1LT5zdV9iYWRsZW4sIFNDT1JFX0lDQVNFLAotCQkJCQkJICAgICAwLCBUUlVFLCBzdS0+c3Vfc2FsbGFuZyk7CisJCQkJCSAgICAgIDAsIFRSVUUsIHN1LT5zdV9zYWxsYW5nLCBGQUxTRSk7CiAgICAgfQogCiAgICAgLyogQmFuIHRoZSBiYWQgd29yZCBpdHNlbGYuICBJdCBtYXkgYXBwZWFyIGluIGFub3RoZXIgcmVnaW9uLiAqLwpAQCAtODkxMiw3ICs5ODU5LDcgQEAKIAllbHNlCiAJewogCSAgICAvKiBVc2UgaW50ZXJuYWwgbWV0aG9kLiAqLwotCSAgICBzcGVsbF9zdWdnZXN0X2ludGVybihzdSk7CisJICAgIHNwZWxsX3N1Z2dlc3RfaW50ZXJuKHN1LCBpbnRlcmFjdGl2ZSk7CiAJICAgIGlmIChzcHNfZmxhZ3MgJiBTUFNfRE9VQkxFKQogCQlkb19jb21iaW5lID0gVFJVRTsKIAl9CkBAIC04OTUyLDE0ICs5ODk5LDE1IEBACiAJICAgIHsKIAkJLyogR2V0IHRoZSB3b3JkIGFuZCB0aGUgc2NvcmUgZnJvbSB0aGUgaXRlbXMuICovCiAJCXNjb3JlID0gZ2V0X3NwZWxsd29yZChsaS0+bGlfdHYudnZhbC52X2xpc3QsICZwKTsKLQkJaWYgKHNjb3JlID49IDApCi0JCSAgICBhZGRfc3VnZ2VzdGlvbihzdSwgJnN1LT5zdV9nYSwgcCwKLQkJCSAgICAgICBzdS0+c3VfYmFkbGVuLCBzY29yZSwgMCwgVFJVRSwgc3UtPnN1X3NhbGxhbmcpOworCQlpZiAoc2NvcmUgPj0gMCAmJiBzY29yZSA8PSBzdS0+c3VfbWF4c2NvcmUpCisJCSAgICBhZGRfc3VnZ2VzdGlvbihzdSwgJnN1LT5zdV9nYSwgcCwgc3UtPnN1X2JhZGxlbiwKKwkJCQkgICAgICAgc2NvcmUsIDAsIFRSVUUsIHN1LT5zdV9zYWxsYW5nLCBGQUxTRSk7CiAJICAgIH0KIAlsaXN0X3VucmVmKGxpc3QpOwogICAgIH0KIAotICAgIC8qIFNvcnQgdGhlIHN1Z2dlc3Rpb25zIGFuZCB0cnVuY2F0ZSBhdCAibWF4Y291bnQiLiAqLworICAgIC8qIFJlbW92ZSBib2d1cyBzdWdnZXN0aW9ucywgc29ydCBhbmQgdHJ1bmNhdGUgYXQgIm1heGNvdW50Ii4gKi8KKyAgICBjaGVja19zdWdnZXN0aW9ucyhzdSwgJnN1LT5zdV9nYSk7CiAgICAgKHZvaWQpY2xlYW51cF9zdWdnZXN0aW9ucygmc3UtPnN1X2dhLCBzdS0+c3VfbWF4c2NvcmUsIHN1LT5zdV9tYXhjb3VudCk7CiB9CiAjZW5kaWYKQEAgLTkwMTEsMTMgKzk5NTksMTQgQEAKIAkgICAgfQogCiAJICAgIGFkZF9zdWdnZXN0aW9uKHN1LCAmc3UtPnN1X2dhLCBwLCBzdS0+c3VfYmFkbGVuLAotCQkJCQkgU0NPUkVfRklMRSwgMCwgVFJVRSwgc3UtPnN1X3NhbGxhbmcpOworCQkJCSAgU0NPUkVfRklMRSwgMCwgVFJVRSwgc3UtPnN1X3NhbGxhbmcsIEZBTFNFKTsKIAl9CiAgICAgfQogCiAgICAgZmNsb3NlKGZkKTsKIAotICAgIC8qIFNvcnQgdGhlIHN1Z2dlc3Rpb25zIGFuZCB0cnVuY2F0ZSBhdCAibWF4Y291bnQiLiAqLworICAgIC8qIFJlbW92ZSBib2d1cyBzdWdnZXN0aW9ucywgc29ydCBhbmQgdHJ1bmNhdGUgYXQgIm1heGNvdW50Ii4gKi8KKyAgICBjaGVja19zdWdnZXN0aW9ucyhzdSwgJnN1LT5zdV9nYSk7CiAgICAgKHZvaWQpY2xlYW51cF9zdWdnZXN0aW9ucygmc3UtPnN1X2dhLCBzdS0+c3VfbWF4c2NvcmUsIHN1LT5zdV9tYXhjb3VudCk7CiB9CiAKQEAgLTkwMjUsMTAgKzk5NzQsMTYgQEAKICAqIEZpbmQgc3VnZ2VzdGlvbnMgZm9yIHRoZSBpbnRlcm5hbCBtZXRob2QgaW5kaWNhdGVkIGJ5ICJzcHNfZmxhZ3MiLgogICovCiAgICAgc3RhdGljIHZvaWQKLXNwZWxsX3N1Z2dlc3RfaW50ZXJuKHN1KQorc3BlbGxfc3VnZ2VzdF9pbnRlcm4oc3UsIGludGVyYWN0aXZlKQogICAgIHN1Z2luZm9fVAkqc3U7CisgICAgaW50CQlpbnRlcmFjdGl2ZTsKIHsKICAgICAvKgorICAgICAqIExvYWQgdGhlIC5zdWcgZmlsZShzKSB0aGF0IGFyZSBhdmFpbGFibGUgYW5kIG5vdCBkb25lIHlldC4KKyAgICAgKi8KKyAgICBzdWdnZXN0X2xvYWRfZmlsZXMoKTsKKworICAgIC8qCiAgICAgICogMS4gVHJ5IHNwZWNpYWwgY2FzZXMsIHN1Y2ggYXMgcmVwZWF0aW5nIGEgd29yZDogInRoZSB0aGUiIC0+ICJ0aGUiLgogICAgICAqCiAgICAgICogU2V0IGEgbWF4aW11bSBzY29yZSB0byBsaW1pdCB0aGUgY29tYmluYXRpb24gb2Ygb3BlcmF0aW9ucyB0aGF0IGlzCkBAIC05MDQ4LDIyICsxMDAwMyw1MCBAQAogCiAgICAgLyoKICAgICAgKiAzLiBUcnkgZmluZGluZyBzb3VuZC1hLWxpa2Ugd29yZHMuCi0gICAgICoKLSAgICAgKiBPbmx5IGRvIHRoaXMgd2hlbiB3ZSBkb24ndCBoYXZlIGEgbG90IG9mIHN1Z2dlc3Rpb25zIHlldCwgYmVjYXVzZSBpdCdzCi0gICAgICogdmVyeSBzbG93IGFuZCBvZnRlbiBkb2Vzbid0IGZpbmQgbmV3IHN1Z2dlc3Rpb25zLgogICAgICAqLwotICAgIGlmICgoc3BzX2ZsYWdzICYgU1BTX0RPVUJMRSkKLQkgICAgfHwgKCEoc3BzX2ZsYWdzICYgU1BTX0ZBU1QpCi0JCQkJICAgICYmIHN1LT5zdV9nYS5nYV9sZW4gPCBTVUdfQ0xFQU5fQ09VTlQoc3UpKSkKKyAgICBpZiAoKHNwc19mbGFncyAmIFNQU19GQVNUKSA9PSAwKQogICAgIHsKLQkvKiBBbGxvdyBhIGhpZ2hlciBzY29yZSBub3cuICovCi0Jc3UtPnN1X21heHNjb3JlID0gU0NPUkVfTUFYTUFYOworCWlmIChzcHNfZmxhZ3MgJiBTUFNfQkVTVCkKKwkgICAgLyogQWRqdXN0IHRoZSB3b3JkIHNjb3JlIGZvciB0aGUgc3VnZ2VzdGlvbnMgZm91bmQgc28gZmFyIGZvciBob3cKKwkgICAgICogdGhleSBzb3VuZHMgbGlrZS4gKi8KKwkgICAgcmVzY29yZV9zdWdnZXN0aW9ucyhzdSk7CisKKwkvKgorCSAqIFdoaWxlIGdvaW5nIHRocm91Z2h0IHRoZSBzb3VuZGZvbGQgdHJlZSAic3VfbWF4c2NvcmUiIGlzIHRoZSBzY29yZQorCSAqIGZvciB0aGUgc291bmRmb2xkIHdvcmQsIGxpbWl0cyB0aGUgY2hhbmdlcyB0aGF0IGFyZSBiZWluZyB0cmllZCwKKwkgKiBhbmQgInN1X3NmbWF4c2NvcmUiIHRoZSByZXNjb3JlZCBzY29yZSwgd2hpY2ggaXMgc2V0IGJ5CisJICogY2xlYW51cF9zdWdnZXN0aW9ucygpLgorCSAqIEZpcnN0IGZpbmQgd29yZHMgd2l0aCBhIHNtYWxsIGVkaXQgZGlzdGFuY2UsIGJlY2F1c2UgdGhpcyBpcyBtdWNoCisJICogZmFzdGVyIGFuZCBvZnRlbiBhbHJlYWR5IGZpbmRzIHRoZSB0b3AtTiBzdWdnZXN0aW9ucy4gIElmIHdlIGRpZG4ndAorCSAqIGZpbmQgbWFueSBzdWdnZXN0aW9ucyB0cnkgYWdhaW4gd2l0aCBhIGhpZ2hlciBlZGl0IGRpc3RhbmNlLgorCSAqICJzbF9zb3VuZGRvbmUiIGlzIHVzZWQgdG8gYXZvaWQgZG9pbmcgdGhlIHNhbWUgd29yZCB0d2ljZS4KKwkgKi8KKwlzdWdnZXN0X3RyeV9zb3VuZGFsaWtlX3ByZXAoKTsKKwlzdS0+c3VfbWF4c2NvcmUgPSBTQ09SRV9TRk1BWDE7CisJc3UtPnN1X3NmbWF4c2NvcmUgPSBTQ09SRV9NQVhJTklUICogMzsKIAlzdWdnZXN0X3RyeV9zb3VuZGFsaWtlKHN1KTsKKwlpZiAoc3UtPnN1X2dhLmdhX2xlbiA8IFNVR19DTEVBTl9DT1VOVChzdSkpCisJeworCSAgICAvKiBXZSBkaWRuJ3QgZmluZCBlbm91Z2ggbWF0Y2hlcywgdHJ5IGFnYWluLCBhbGxvd2luZyBtb3JlCisJICAgICAqIGNoYW5nZXMgdG8gdGhlIHNvdW5kZm9sZCB3b3JkLiAqLworCSAgICBzdS0+c3VfbWF4c2NvcmUgPSBTQ09SRV9TRk1BWDI7CisJICAgIHN1Z2dlc3RfdHJ5X3NvdW5kYWxpa2Uoc3UpOworCSAgICBpZiAoc3UtPnN1X2dhLmdhX2xlbiA8IFNVR19DTEVBTl9DT1VOVChzdSkpCisJICAgIHsKKwkJLyogU3RpbGwgZGlkbid0IGZpbmQgZW5vdWdoIG1hdGNoZXMsIHRyeSBhZ2FpbiwgYWxsb3dpbmcgZXZlbgorCQkgKiBtb3JlIGNoYW5nZXMgdG8gdGhlIHNvdW5kZm9sZCB3b3JkLiAqLworCQlzdS0+c3VfbWF4c2NvcmUgPSBTQ09SRV9TRk1BWDM7CisJCXN1Z2dlc3RfdHJ5X3NvdW5kYWxpa2Uoc3UpOworCSAgICB9CisJfQorCXN1LT5zdV9tYXhzY29yZSA9IHN1LT5zdV9zZm1heHNjb3JlOworCXN1Z2dlc3RfdHJ5X3NvdW5kYWxpa2VfZmluaXNoKCk7CiAgICAgfQogCi0gICAgLyogV2hlbiBDVFJMLUMgd2FzIGhpdCB3aGlsZSBzZWFyY2hpbmcgZG8gc2hvdyB0aGUgcmVzdWx0cy4gKi8KKyAgICAvKiBXaGVuIENUUkwtQyB3YXMgaGl0IHdoaWxlIHNlYXJjaGluZyBkbyBzaG93IHRoZSByZXN1bHRzLiAgT25seSBjbGVhcgorICAgICAqIGdvdF9pbnQgd2hlbiB1c2luZyBhIGNvbW1hbmQsIG5vdCBmb3Igc3BlbGxzdWdnZXN0KCkuICovCiAgICAgdWlfYnJlYWtjaGVjaygpOwotICAgIGlmIChnb3RfaW50KQorICAgIGlmIChpbnRlcmFjdGl2ZSAmJiBnb3RfaW50KQogICAgIHsKIAkodm9pZCl2Z2V0YygpOwogCWdvdF9pbnQgPSBGQUxTRTsKQEAgLTkwNzUsMTIgKzEwMDU4LDIyMCBAQAogCSAgICAvKiBBZGp1c3QgdGhlIHdvcmQgc2NvcmUgZm9yIGhvdyBpdCBzb3VuZHMgbGlrZS4gKi8KIAkgICAgcmVzY29yZV9zdWdnZXN0aW9ucyhzdSk7CiAKLQkvKiBTb3J0IHRoZSBzdWdnZXN0aW9ucyBhbmQgdHJ1bmNhdGUgYXQgIm1heGNvdW50Ii4gKi8KKwkvKiBSZW1vdmUgYm9ndXMgc3VnZ2VzdGlvbnMsIHNvcnQgYW5kIHRydW5jYXRlIGF0ICJtYXhjb3VudCIuICovCisJY2hlY2tfc3VnZ2VzdGlvbnMoc3UsICZzdS0+c3VfZ2EpOwogCSh2b2lkKWNsZWFudXBfc3VnZ2VzdGlvbnMoJnN1LT5zdV9nYSwgc3UtPnN1X21heHNjb3JlLCBzdS0+c3VfbWF4Y291bnQpOwogICAgIH0KIH0KIAogLyoKKyAqIExvYWQgdGhlIC5zdWcgZmlsZXMgZm9yIGxhbmd1YWdlcyB0aGF0IGhhdmUgb25lIGFuZCB3ZXJlbid0IGxvYWRlZCB5ZXQuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorc3VnZ2VzdF9sb2FkX2ZpbGVzKCkKK3sKKyAgICBsYW5ncF9UCSpscDsKKyAgICBpbnQJCWxwaTsKKyAgICBzbGFuZ19UCSpzbGFuZzsKKyAgICBjaGFyX3UJKmRvdHA7CisgICAgRklMRQkqZmQ7CisgICAgY2hhcl91CWJ1ZltNQVhXTEVOXTsKKyAgICBpbnQJCWk7CisgICAgdGltZV90CXRpbWVzdGFtcDsKKyAgICBpbnQJCXdjb3VudDsKKyAgICBpbnQJCXdvcmRucjsKKyAgICBnYXJyYXlfVAlnYTsKKyAgICBpbnQJCWM7CisKKyAgICAvKiBEbyB0aGlzIGZvciBhbGwgbGFuZ3VhZ2VzIHRoYXQgc3VwcG9ydCBzb3VuZCBmb2xkaW5nLiAqLworICAgIGZvciAobHBpID0gMDsgbHBpIDwgY3VyYnVmLT5iX2xhbmdwLmdhX2xlbjsgKytscGkpCisgICAgeworCWxwID0gTEFOR1BfRU5UUlkoY3VyYnVmLT5iX2xhbmdwLCBscGkpOworCXNsYW5nID0gbHAtPmxwX3NsYW5nOworCWlmIChzbGFuZy0+c2xfc3VndGltZSAhPSAwICYmICFzbGFuZy0+c2xfc3VnbG9hZGVkKQorCXsKKwkgICAgLyogQ2hhbmdlICIuc3BsIiB0byAiLnN1ZyIgYW5kIG9wZW4gdGhlIGZpbGUuICBXaGVuIHRoZSBmaWxlIGlzbid0CisJICAgICAqIGZvdW5kIHNpbGVudGx5IHNraXAgaXQuICBEbyBzZXQgInNsX3N1Z2xvYWRlZCIgc28gdGhhdCB3ZQorCSAgICAgKiBkb24ndCB0cnkgYWdhaW4gYW5kIGFnYWluLiAqLworCSAgICBzbGFuZy0+c2xfc3VnbG9hZGVkID0gVFJVRTsKKworCSAgICBkb3RwID0gdmltX3N0cnJjaHIoc2xhbmctPnNsX2ZuYW1lLCAnLicpOworCSAgICBpZiAoZG90cCA9PSBOVUxMIHx8IGZuYW1lY21wKGRvdHAsICIuc3BsIikgIT0gMCkKKwkJY29udGludWU7CisJICAgIFNUUkNQWShkb3RwLCAiLnN1ZyIpOworCSAgICBmZCA9IGZvcGVuKChjaGFyICopc2xhbmctPnNsX2ZuYW1lLCAiciIpOworCSAgICBpZiAoZmQgPT0gTlVMTCkKKwkJZ290byBuZXh0b25lOworCisJICAgIC8qCisJICAgICAqIDxTVUdIRUFERVI+OiA8ZmlsZUlEPiA8dmVyc2lvbm5yPiA8dGltZXN0YW1wPgorCSAgICAgKi8KKwkgICAgZm9yIChpID0gMDsgaSA8IFZJTVNVR01BR0lDTDsgKytpKQorCQlidWZbaV0gPSBnZXRjKGZkKTsJCQkvKiA8ZmlsZUlEPiAqLworCSAgICBpZiAoU1RSTkNNUChidWYsIFZJTVNVR01BR0lDLCBWSU1TVUdNQUdJQ0wpICE9IDApCisJICAgIHsKKwkJRU1TRzIoXygiRTk5OTogVGhpcyBkb2VzIG5vdCBsb29rIGxpa2UgYSAuc3VnIGZpbGU6ICVzIiksCisJCQkJCQkJICAgICBzbGFuZy0+c2xfZm5hbWUpOworCQlnb3RvIG5leHRvbmU7CisJICAgIH0KKwkgICAgYyA9IGdldGMoZmQpOwkJCQkvKiA8dmVyc2lvbm5yPiAqLworCSAgICBpZiAoYyA8IFZJTVNVR1ZFUlNJT04pCisJICAgIHsKKwkJRU1TRzIoXygiRTk5OTogT2xkIC5zdWcgZmlsZSwgbmVlZHMgdG8gYmUgdXBkYXRlZDogJXMiKSwKKwkJCQkJCQkgICAgIHNsYW5nLT5zbF9mbmFtZSk7CisJCWdvdG8gbmV4dG9uZTsKKwkgICAgfQorCSAgICBlbHNlIGlmIChjID4gVklNU1VHVkVSU0lPTikKKwkgICAgeworCQlFTVNHMihfKCJFOTk5OiAuc3VnIGZpbGUgaXMgZm9yIG5ld2VyIHZlcnNpb24gb2YgVmltOiAlcyIpLAorCQkJCQkJCSAgICAgc2xhbmctPnNsX2ZuYW1lKTsKKwkJZ290byBuZXh0b25lOworCSAgICB9CisKKwkgICAgLyogQ2hlY2sgdGhlIHRpbWVzdGFtcCwgaXQgbXVzdCBiZSBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBvbmUgaW4KKwkgICAgICogdGhlIC5zcGwgZmlsZS4gIE90aGVyd2lzZSB0aGUgd29yZCBudW1iZXJzIHdvbid0IG1hdGNoLiAqLworCSAgICB0aW1lc3RhbXAgPSAwOworCSAgICBmb3IgKGkgPSA3OyBpID49IDA7IC0taSkJCS8qIDx0aW1lc3RhbXA+ICovCisJCXRpbWVzdGFtcCArPSBnZXRjKGZkKSA8PCAoaSAqIDgpOworCSAgICBpZiAodGltZXN0YW1wICE9IHNsYW5nLT5zbF9zdWd0aW1lKQorCSAgICB7CisJCUVNU0cyKF8oIkU5OTk6IC5zdWcgZmlsZSBkb2Vzbid0IG1hdGNoIC5zcGwgZmlsZTogJXMiKSwKKwkJCQkJCQkgICAgIHNsYW5nLT5zbF9mbmFtZSk7CisJCWdvdG8gbmV4dG9uZTsKKwkgICAgfQorCisJICAgIC8qCisJICAgICAqIDxTVUdXT1JEVFJFRT46IDx3b3JkdHJlZT4KKwkgICAgICogUmVhZCB0aGUgdHJpZSB3aXRoIHRoZSBzb3VuZGZvbGRlZCB3b3Jkcy4KKwkgICAgICovCisJICAgIGlmIChzcGVsbF9yZWFkX3RyZWUoZmQsICZzbGFuZy0+c2xfc2J5dHMsICZzbGFuZy0+c2xfc2lkeHMsCisJCQkJCQkJICAgICAgIEZBTFNFLCAwKSAhPSAwKQorCSAgICB7Citzb21lZXJyb3I6CisJCUVNU0cyKF8oIkU5OTk6IGVycm9yIHdoaWxlIHJlYWRpbmcgLnN1ZyBmaWxlOiAlcyIpLAorCQkJCQkJCSAgICAgc2xhbmctPnNsX2ZuYW1lKTsKKwkJc2xhbmdfY2xlYXJfc3VnKHNsYW5nKTsKKwkJZ290byBuZXh0b25lOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogPFNVR1RBQkxFPjogPHN1Z3djb3VudD4gPHN1Z2xpbmU+IC4uLgorCSAgICAgKgorCSAgICAgKiBSZWFkIHRoZSB0YWJsZSB3aXRoIHdvcmQgbnVtYmVycy4gIFdlIHVzZSBhIGZpbGUgYnVmZmVyIGZvcgorCSAgICAgKiB0aGlzLCBiZWNhdXNlIGl0J3Mgc28gbXVjaCBsaWtlIGEgZmlsZSB3aXRoIGxpbmVzLiAgTWFrZXMgaXQKKwkgICAgICogcG9zc2libGUgdG8gc3dhcCB0aGUgaW5mbyBhbmQgc2F2ZSBvbiBtZW1vcnkgdXNlLgorCSAgICAgKi8KKwkgICAgc2xhbmctPnNsX3N1Z2J1ZiA9IG9wZW5fc3BlbGxidWYoKTsKKwkgICAgaWYgKHNsYW5nLT5zbF9zdWdidWYgPT0gTlVMTCkKKwkJZ290byBzb21lZXJyb3I7CisJCQkJCQkJICAgIC8qIDxzdWd3Y291bnQ+ICovCisJICAgIHdjb3VudCA9IChnZXRjKGZkKSA8PCAyNCkgKyAoZ2V0YyhmZCkgPDwgMTYpICsgKGdldGMoZmQpIDw8IDgpCisJCQkJCQkJCSAgICsgZ2V0YyhmZCk7CisJICAgIGlmICh3Y291bnQgPCAwKQorCQlnb3RvIHNvbWVlcnJvcjsKKworCSAgICAvKiBSZWFkIGFsbCB0aGUgd29yZG5yIGxpc3RzIGludG8gdGhlIGJ1ZmZlciwgb25lIE5VTCB0ZXJtaW5hdGVkCisJICAgICAqIGxpc3QgcGVyIGxpbmUuICovCisJICAgIGdhX2luaXQyKCZnYSwgMSwgMTAwKTsKKwkgICAgZm9yICh3b3JkbnIgPSAwOyB3b3JkbnIgPCB3Y291bnQ7ICsrd29yZG5yKQorCSAgICB7CisJCWdhLmdhX2xlbiA9IDA7CisJCWZvciAoOzspCisJCXsKKwkJICAgIGMgPSBnZXRjKGZkKTsJCQkgICAgLyogPHN1Z2xpbmU+ICovCisJCSAgICBpZiAoYyA8IDAgfHwgZ2FfZ3JvdygmZ2EsIDEpID09IEZBSUwpCisJCQlnb3RvIHNvbWVlcnJvcjsKKwkJICAgICgoY2hhcl91ICopZ2EuZ2FfZGF0YSlbZ2EuZ2FfbGVuKytdID0gYzsKKwkJICAgIGlmIChjID09IE5VTCkKKwkJCWJyZWFrOworCQl9CisJCWlmIChtbF9hcHBlbmRfYnVmKHNsYW5nLT5zbF9zdWdidWYsIChsaW5lbnJfVCl3b3JkbnIsCisJCQkJCSBnYS5nYV9kYXRhLCBnYS5nYV9sZW4sIFRSVUUpID09IEZBSUwpCisJCSAgICBnb3RvIHNvbWVlcnJvcjsKKwkgICAgfQorCSAgICBnYV9jbGVhcigmZ2EpOworCisJICAgIC8qCisJICAgICAqIE5lZWQgdG8gcHV0IHdvcmQgY291bnRzIGluIHRoZSB3b3JkIHRyaWVzLCBzbyB0aGF0IHdlIGNhbiBmaW5kCisJICAgICAqIGEgd29yZCBieSBpdHMgbnVtYmVyLgorCSAgICAgKi8KKwkgICAgdHJlZV9jb3VudF93b3JkcyhzbGFuZy0+c2xfZmJ5dHMsIHNsYW5nLT5zbF9maWR4cyk7CisJICAgIHRyZWVfY291bnRfd29yZHMoc2xhbmctPnNsX3NieXRzLCBzbGFuZy0+c2xfc2lkeHMpOworCituZXh0b25lOgorCSAgICBpZiAoZmQgIT0gTlVMTCkKKwkJZmNsb3NlKGZkKTsKKwkgICAgU1RSQ1BZKGRvdHAsICIuc3BsIik7CisJfQorICAgIH0KK30KKworCisvKgorICogRmlsbCBpbiB0aGUgd29yZGNvdW50IGZpZWxkcyBmb3IgYSB0cmllLgorICogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHdvcmRzLgorICovCisgICAgc3RhdGljIHZvaWQKK3RyZWVfY291bnRfd29yZHMoYnl0cywgaWR4cykKKyAgICBjaGFyX3UJKmJ5dHM7CisgICAgaWR4X1QJKmlkeHM7Cit7CisgICAgaW50CQlkZXB0aDsKKyAgICBpZHhfVAlhcnJpZHhbTUFYV0xFTl07CisgICAgaW50CQljdXJpW01BWFdMRU5dOworICAgIGludAkJYzsKKyAgICBpZHhfVAluOworICAgIGludAkJd29yZGNvdW50W01BWFdMRU5dOworCisgICAgYXJyaWR4WzBdID0gMDsKKyAgICBjdXJpWzBdID0gMTsKKyAgICB3b3JkY291bnRbMF0gPSAwOworICAgIGRlcHRoID0gMDsKKyAgICB3aGlsZSAoZGVwdGggPj0gMCAmJiAhZ290X2ludCkKKyAgICB7CisJaWYgKGN1cmlbZGVwdGhdID4gYnl0c1thcnJpZHhbZGVwdGhdXSkKKwl7CisJICAgIC8qIERvbmUgYWxsIGJ5dGVzIGF0IHRoaXMgbm9kZSwgZ28gdXAgb25lIGxldmVsLiAqLworCSAgICBpZHhzW2FycmlkeFtkZXB0aF1dID0gd29yZGNvdW50W2RlcHRoXTsKKwkgICAgaWYgKGRlcHRoID4gMCkKKwkJd29yZGNvdW50W2RlcHRoIC0gMV0gKz0gd29yZGNvdW50W2RlcHRoXTsKKworCSAgICAtLWRlcHRoOworCSAgICBmYXN0X2JyZWFrY2hlY2soKTsKKwl9CisJZWxzZQorCXsKKwkgICAgLyogRG8gb25lIG1vcmUgYnl0ZSBhdCB0aGlzIG5vZGUuICovCisJICAgIG4gPSBhcnJpZHhbZGVwdGhdICsgY3VyaVtkZXB0aF07CisJICAgICsrY3VyaVtkZXB0aF07CisKKwkgICAgYyA9IGJ5dHNbbl07CisJICAgIGlmIChjID09IDApCisJICAgIHsKKwkJLyogRW5kIG9mIHdvcmQsIGNvdW50IGl0LiAqLworCQkrK3dvcmRjb3VudFtkZXB0aF07CisKKwkJLyogU2tpcCBvdmVyIGFueSBvdGhlciBOVUwgYnl0ZXMgKHNhbWUgd29yZCB3aXRoIGRpZmZlcmVudAorCQkgKiBmbGFncykuICovCisJCXdoaWxlIChieXRzW24gKyAxXSA9PSAwKQorCQl7CisJCSAgICArK247CisJCSAgICArK2N1cmlbZGVwdGhdOworCQl9CisJICAgIH0KKwkgICAgZWxzZQorCSAgICB7CisJCS8qIE5vcm1hbCBjaGFyLCBnbyBvbmUgbGV2ZWwgZGVlcGVyIHRvIGNvdW50IHRoZSB3b3Jkcy4gKi8KKwkJKytkZXB0aDsKKwkJYXJyaWR4W2RlcHRoXSA9IGlkeHNbbl07CisJCWN1cmlbZGVwdGhdID0gMTsKKwkJd29yZGNvdW50W2RlcHRoXSA9IDA7CisJICAgIH0KKwl9CisgICAgfQorfQorCisvKgogICogRnJlZSB0aGUgaW5mbyBwdXQgaW4gIipzdSIgYnkgc3BlbGxfZmluZF9zdWdnZXN0KCkuCiAgKi8KICAgICBzdGF0aWMgdm9pZApAQCAtOTA5OCw3ICsxMDI4OSw3IEBACiAgICAgZ2FfY2xlYXIoJnN1LT5zdV9zZ2EpOwogCiAgICAgLyogRnJlZSB0aGUgYmFubmVkIHdvcmRzLiAqLwotICAgIGZyZWVfYmFubmVkKHN1KTsKKyAgICBoYXNoX2NsZWFyX2FsbCgmc3UtPnN1X2Jhbm5lZCwgMCk7CiB9CiAKIC8qCkBAIC05MjI0LDYwICsxMDQxNSwyMiBAQAogCS8qIEdpdmUgYSBzb3VuZGFsaWtlIHNjb3JlIG9mIDAsIGNvbXB1dGUgdGhlIHNjb3JlIGFzIGlmIGRlbGV0aW5nIG9uZQogCSAqIGNoYXJhY3Rlci4gKi8KIAlhZGRfc3VnZ2VzdGlvbihzdSwgJnN1LT5zdV9nYSwgd29yZCwgc3UtPnN1X2JhZGxlbiwKLQkJCSAgICAgIFJFU0NPUkUoU0NPUkVfUkVQLCAwKSwgMCwgVFJVRSwgc3UtPnN1X3NhbGxhbmcpOworCQkgICAgICAgUkVTQ09SRShTQ09SRV9SRVAsIDApLCAwLCBUUlVFLCBzdS0+c3Vfc2FsbGFuZywgRkFMU0UpOwogICAgIH0KIH0KIAogLyoKICAqIFRyeSBmaW5kaW5nIHN1Z2dlc3Rpb25zIGJ5IGFkZGluZy9yZW1vdmluZy9zd2FwcGluZyBsZXR0ZXJzLgotICoKLSAqIFRoaXMgdXNlcyBhIHN0YXRlIG1hY2hpbmUuICBBdCBlYWNoIG5vZGUgaW4gdGhlIHRyZWUgd2UgdHJ5IHZhcmlvdXMKLSAqIG9wZXJhdGlvbnMuICBXaGVuIHRyeWluZyBpZiBhbiBvcGVyYXRpb24gd29yayAiZGVwdGgiIGlzIGluY3JlYXNlZCBhbmQgdGhlCi0gKiBzdGFja1tdIGlzIHVzZWQgdG8gc3RvcmUgaW5mby4gIFRoaXMgYWxsb3dzIGNvbWJpbmF0aW9ucywgdGh1cyBpbnNlcnQgb25lCi0gKiBjaGFyYWN0ZXIsIHJlcGxhY2Ugb25lIGFuZCBkZWxldGUgYW5vdGhlci4gIFRoZSBudW1iZXIgb2YgY2hhbmdlcyBpcwotICogbGltaXRlZCBieSBzdS0+c3VfbWF4c2NvcmUsIGNoZWNrZWQgaW4gdHJ5X2RlZXBlcigpLgotICoKLSAqIEFmdGVyIGltcGxlbWVudGluZyB0aGlzIEkgbm90aWNlZCBhbiBhcnRpY2xlIGJ5IEtlbWFsIE9mbGF6ZXIgdGhhdAotICogZGVzY3JpYmVzIHNvbWV0aGluZyBzaW1pbGFyOiAiRXJyb3ItdG9sZXJhbnQgRmluaXRlIFN0YXRlIFJlY29nbml0aW9uIHdpdGgKLSAqIEFwcGxpY2F0aW9ucyB0byBNb3JwaG9sb2dpY2FsIEFuYWx5c2lzIGFuZCBTcGVsbGluZyBDb3JyZWN0aW9uIiAoMTk5NikuCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gaW4gdGhlIGFydGljbGUgaXMgc2ltcGxpZmllZCBhbmQgcmVxdWlyZXMgYSBzdGFjayBvZgotICogdW5rbm93biBkZXB0aC4gIFRoZSBpbXBsZW1lbnRhdGlvbiBoZXJlIG9ubHkgbmVlZHMgYSBzdGFjayBkZXB0aCBvZiB0aGUKLSAqIGxlbmd0aCBvZiB0aGUgd29yZC4KICAqLwogICAgIHN0YXRpYyB2b2lkCiBzdWdnZXN0X3RyeV9jaGFuZ2Uoc3UpCiAgICAgc3VnaW5mb19UCSpzdTsKIHsKICAgICBjaGFyX3UJZndvcmRbTUFYV0xFTl07CSAgICAvKiBjb3B5IG9mIHRoZSBiYWQgd29yZCwgY2FzZS1mb2xkZWQgKi8KLSAgICBjaGFyX3UJdHdvcmRbTUFYV0xFTl07CSAgICAvKiBnb29kIHdvcmQgY29sbGVjdGVkIHNvIGZhciAqLwotICAgIHRyeXN0YXRlX1QJc3RhY2tbTUFYV0xFTl07Ci0gICAgY2hhcl91CXByZXdvcmRbTUFYV0xFTiAqIDNdOyAvKiB3b3JkIGZvdW5kIHdpdGggcHJvcGVyIGNhc2U7Ci0JCQkJICAgICAgICogY29uY2F0YW5hdGlvbiBvZiBwcmVmaXggY29tcG91bmQKLQkJCQkgICAgICAgKiB3b3JkcyBhbmQgc3BsaXQgd29yZC4gIE5VTCB0ZXJtaW5hdGVkCi0JCQkJICAgICAgICogd2hlbiBnb2luZyBkZWVwZXIgYnV0IG5vdCB3aGVuIGNvbWluZwotCQkJCSAgICAgICAqIGJhY2suICovCi0gICAgY2hhcl91CWNvbXBmbGFnc1tNQVhXTEVOXTsJLyogY29tcG91bmQgZmxhZ3MsIG9uZSBmb3IgZWFjaCB3b3JkICovCi0gICAgdHJ5c3RhdGVfVAkqc3A7Ci0gICAgaW50CQluZXdzY29yZTsKLSAgICBsYW5ncF9UCSpscDsKLSAgICBjaGFyX3UJKmJ5dHMsICpmYnl0cywgKnBieXRzOwotICAgIGlkeF9UCSppZHhzLCAqZmlkeHMsICpwaWR4czsKLSAgICBpbnQJCWRlcHRoOwotICAgIGludAkJYywgYzIsIGMzOwogICAgIGludAkJbjsKLSAgICBpbnQJCWZsYWdzOwotICAgIGdhcnJheV9UCSpnYXA7Ci0gICAgaWR4X1QJYXJyaWR4OwotICAgIGludAkJbGVuOwogICAgIGNoYXJfdQkqcDsKLSAgICBmcm9tdG9fVAkqZnRwOwotICAgIGludAkJZmwgPSAwLCB0bDsKLSAgICBpbnQJCXJlcGV4dHJhID0gMDsJICAgIC8qIGV4dHJhIGJ5dGVzIGluIGZ3b3JkW10gZnJvbSBSRVAgaXRlbSAqLwotICAgIHNsYW5nX1QJKnNsYW5nOwotICAgIGludAkJZndvcmRfZW5kczsKICAgICBpbnQJCWxwaTsKLSAgICBpbnQJCW1heXNwbGl0OwotICAgIGludAkJZ29vZHdvcmRfZW5kczsKKyAgICBsYW5ncF9UCSpscDsKIAogICAgIC8qIFdlIG1ha2UgYSBjb3B5IG9mIHRoZSBjYXNlLWZvbGRlZCBiYWQgd29yZCwgc28gdGhhdCB3ZSBjYW4gbW9kaWZ5IGl0CiAgICAgICogdG8gZmluZCBtYXRjaGVzIChlc3AuIFJFUCBpdGVtcykuICBBcHBlbmQgc29tZSBtb3JlIHRleHQsIGNoYW5naW5nCkBAIC05MjkwLDI0ICsxMDQ0MywxMTYgQEAKICAgICBmb3IgKGxwaSA9IDA7IGxwaSA8IGN1cmJ1Zi0+Yl9sYW5ncC5nYV9sZW47ICsrbHBpKQogICAgIHsKIAlscCA9IExBTkdQX0VOVFJZKGN1cmJ1Zi0+Yl9sYW5ncCwgbHBpKTsKLQlzbGFuZyA9IGxwLT5scF9zbGFuZzsKIAogCS8qIElmIHJlbG9hZGluZyBhIHNwZWxsIGZpbGUgZmFpbHMgaXQncyBzdGlsbCBpbiB0aGUgbGlzdCBidXQKIAkgKiBldmVyeXRoaW5nIGhhcyBiZWVuIGNsZWFyZWQuICovCi0JaWYgKHNsYW5nLT5zbF9mYnl0cyA9PSBOVUxMKQorCWlmIChscC0+bHBfc2xhbmctPnNsX2ZieXRzID09IE5VTEwpCiAJICAgIGNvbnRpbnVlOwogCi0JLyoKLQkgKiBHbyB0aHJvdWdoIHRoZSB3aG9sZSBjYXNlLWZvbGQgdHJlZSwgdHJ5IGNoYW5nZXMgYXQgZWFjaCBub2RlLgotCSAqICJ0d29yZFtdIiBjb250YWlucyB0aGUgd29yZCBjb2xsZWN0ZWQgZnJvbSBub2RlcyBpbiB0aGUgdHJlZS4KLQkgKiAiZndvcmRbXSIgdGhlIHdvcmQgd2UgYXJlIHRyeWluZyB0byBtYXRjaCB3aXRoIChpbml0aWFsbHkgdGhlIGJhZAotCSAqIHdvcmQpLgotCSAqLwotCWRlcHRoID0gMDsKLQlzcCA9ICZzdGFja1swXTsKLQl2aW1fbWVtc2V0KHNwLCAwLCBzaXplb2YodHJ5c3RhdGVfVCkpOwotCXNwLT50c19jdXJpID0gMTsKKwkvKiBUcnkgaXQgZm9yIHRoaXMgbGFuZ3VhZ2UuICBXaWxsIGFkZCBwb3NzaWJsZSBzdWdnZXN0aW9ucy4gKi8KKwlzdWdnZXN0X3RyaWVfd2FsayhzdSwgbHAsIGZ3b3JkLCBGQUxTRSk7CisgICAgfQorfQogCisvKiBDaGVjayB0aGUgbWF4aW11bSBzY29yZSwgaWYgd2UgZ28gb3ZlciBpdCB3ZSB3b24ndCB0cnkgdGhpcyBjaGFuZ2UuICovCisjZGVmaW5lIFRSWV9ERUVQRVIoc3UsIHN0YWNrLCBkZXB0aCwgYWRkKSBcCisJCShzdGFja1tkZXB0aF0udHNfc2NvcmUgKyAoYWRkKSA8IHN1LT5zdV9tYXhzY29yZSkKKworLyoKKyAqIFRyeSBmaW5kaW5nIHN1Z2dlc3Rpb25zIGJ5IGFkZGluZy9yZW1vdmluZy9zd2FwcGluZyBsZXR0ZXJzLgorICoKKyAqIFRoaXMgdXNlcyBhIHN0YXRlIG1hY2hpbmUuICBBdCBlYWNoIG5vZGUgaW4gdGhlIHRyZWUgd2UgdHJ5IHZhcmlvdXMKKyAqIG9wZXJhdGlvbnMuICBXaGVuIHRyeWluZyBpZiBhbiBvcGVyYXRpb24gd29ya3MgImRlcHRoIiBpcyBpbmNyZWFzZWQgYW5kIHRoZQorICogc3RhY2tbXSBpcyB1c2VkIHRvIHN0b3JlIGluZm8uICBUaGlzIGFsbG93cyBjb21iaW5hdGlvbnMsIHRodXMgaW5zZXJ0IG9uZQorICogY2hhcmFjdGVyLCByZXBsYWNlIG9uZSBhbmQgZGVsZXRlIGFub3RoZXIuICBUaGUgbnVtYmVyIG9mIGNoYW5nZXMgaXMKKyAqIGxpbWl0ZWQgYnkgc3UtPnN1X21heHNjb3JlLgorICoKKyAqIEFmdGVyIGltcGxlbWVudGluZyB0aGlzIEkgbm90aWNlZCBhbiBhcnRpY2xlIGJ5IEtlbWFsIE9mbGF6ZXIgdGhhdAorICogZGVzY3JpYmVzIHNvbWV0aGluZyBzaW1pbGFyOiAiRXJyb3ItdG9sZXJhbnQgRmluaXRlIFN0YXRlIFJlY29nbml0aW9uIHdpdGgKKyAqIEFwcGxpY2F0aW9ucyB0byBNb3JwaG9sb2dpY2FsIEFuYWx5c2lzIGFuZCBTcGVsbGluZyBDb3JyZWN0aW9uIiAoMTk5NikuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gaW4gdGhlIGFydGljbGUgaXMgc2ltcGxpZmllZCBhbmQgcmVxdWlyZXMgYSBzdGFjayBvZgorICogdW5rbm93biBkZXB0aC4gIFRoZSBpbXBsZW1lbnRhdGlvbiBoZXJlIG9ubHkgbmVlZHMgYSBzdGFjayBkZXB0aCBlcXVhbCB0bworICogdGhlIGxlbmd0aCBvZiB0aGUgd29yZC4KKyAqCisgKiBUaGlzIGlzIGFsc28gdXNlZCBmb3IgdGhlIHNvdW5kLWZvbGRlZCB3b3JkLCAic291bmRmb2xkIiBpcyBUUlVFIHRoZW4uCisgKiBUaGUgbWVjaGFuaXNtIGlzIHRoZSBzYW1lLCBidXQgd2UgZmluZCBhIG1hdGNoIHdpdGggYSBzb3VuZC1mb2xkZWQgd29yZAorICogdGhhdCBjb21lcyBmcm9tIG9uZSBvciBtb3JlIG9yaWdpbmFsIHdvcmRzLiAgRWFjaCBvZiB0aGVzZSB3b3JkcyBtYXkgYmUKKyAqIGFkZGVkLCB0aGlzIGlzIGRvbmUgYnkgYWRkX3NvdW5kX3N1Z2dlc3QoKS4KKyAqIERvbid0IHVzZToKKyAqCXRoZSBwcmVmaXggdHJlZSBvciB0aGUga2VlcC1jYXNlIHRyZWUKKyAqCSJzdS0+c3VfYmFkbGVuIgorICoJYW55dGhpbmcgdG8gZG8gd2l0aCB1cHBlciBhbmQgbG93ZXIgY2FzZQorICoJYW55dGhpbmcgdG8gZG8gd2l0aCB3b3JkIG9yIG5vbi13b3JkIGNoYXJhY3RlcnMgKCJzcGVsbF9pc3dvcmRwKCkiKQorICoJYmFubmVkIHdvcmRzCisgKgl3b3JkIGZsYWdzIChyYXJlLCByZWdpb24sIGNvbXBvdW5kaW5nKQorICoJd29yZCBzcGxpdHRpbmcgZm9yIG5vdworICoJInNpbWlsYXJfY2hhcnMoKSIKKyAqCXVzZSAic2xhbmctPnNsX3JlcHNhbCIgaW5zdGVhZCBvZiAibHAtPmxwX3JlcGxhbmctPnNsX3JlcCIKKyAqLworICAgIHN0YXRpYyB2b2lkCitzdWdnZXN0X3RyaWVfd2FsayhzdSwgbHAsIGZ3b3JkLCBzb3VuZGZvbGQpCisgICAgc3VnaW5mb19UCSpzdTsKKyAgICBsYW5ncF9UCSpscDsKKyAgICBjaGFyX3UJKmZ3b3JkOworICAgIGludAkJc291bmRmb2xkOworeworICAgIGNoYXJfdQl0d29yZFtNQVhXTEVOXTsJICAgIC8qIGdvb2Qgd29yZCBjb2xsZWN0ZWQgc28gZmFyICovCisgICAgdHJ5c3RhdGVfVAlzdGFja1tNQVhXTEVOXTsKKyAgICBjaGFyX3UJcHJld29yZFtNQVhXTEVOICogM107IC8qIHdvcmQgZm91bmQgd2l0aCBwcm9wZXIgY2FzZTsKKwkJCQkgICAgICAgKiBjb25jYXRhbmF0aW9uIG9mIHByZWZpeCBjb21wb3VuZAorCQkJCSAgICAgICAqIHdvcmRzIGFuZCBzcGxpdCB3b3JkLiAgTlVMIHRlcm1pbmF0ZWQKKwkJCQkgICAgICAgKiB3aGVuIGdvaW5nIGRlZXBlciBidXQgbm90IHdoZW4gY29taW5nCisJCQkJICAgICAgICogYmFjay4gKi8KKyAgICBjaGFyX3UJY29tcGZsYWdzW01BWFdMRU5dOwkvKiBjb21wb3VuZCBmbGFncywgb25lIGZvciBlYWNoIHdvcmQgKi8KKyAgICB0cnlzdGF0ZV9UCSpzcDsKKyAgICBpbnQJCW5ld3Njb3JlOworICAgIGludAkJc2NvcmU7CisgICAgY2hhcl91CSpieXRzLCAqZmJ5dHMsICpwYnl0czsKKyAgICBpZHhfVAkqaWR4cywgKmZpZHhzLCAqcGlkeHM7CisgICAgaW50CQlkZXB0aDsKKyAgICBpbnQJCWMsIGMyLCBjMzsKKyAgICBpbnQJCW4gPSAwOworICAgIGludAkJZmxhZ3M7CisgICAgZ2FycmF5X1QJKmdhcDsKKyAgICBpZHhfVAlhcnJpZHg7CisgICAgaW50CQlsZW47CisgICAgY2hhcl91CSpwOworICAgIGZyb210b19UCSpmdHA7CisgICAgaW50CQlmbCA9IDAsIHRsOworICAgIGludAkJcmVwZXh0cmEgPSAwOwkgICAgLyogZXh0cmEgYnl0ZXMgaW4gZndvcmRbXSBmcm9tIFJFUCBpdGVtICovCisgICAgc2xhbmdfVAkqc2xhbmcgPSBscC0+bHBfc2xhbmc7CisgICAgaW50CQlmd29yZF9lbmRzOworICAgIGludAkJZ29vZHdvcmRfZW5kczsKKyNpZmRlZiBERUJVR19UUklFV0FMSworICAgIC8qIFN0b3JlcyB0aGUgbmFtZSBvZiB0aGUgY2hhbmdlIG1hZGUgYXQgZWFjaCBsZXZlbC4gKi8KKyAgICBjaGFyX3UJY2hhbmdlbmFtZVtNQVhXTEVOXVs4MF07CisjZW5kaWYKKyAgICBpbnQJCWJyZWFrY2hlY2tjb3VudCA9IDEwMDA7CisgICAgaW50CQljb21wb3VuZF9vazsKKworICAgIC8qCisgICAgICogR28gdGhyb3VnaCB0aGUgd2hvbGUgY2FzZS1mb2xkIHRyZWUsIHRyeSBjaGFuZ2VzIGF0IGVhY2ggbm9kZS4KKyAgICAgKiAidHdvcmRbXSIgY29udGFpbnMgdGhlIHdvcmQgY29sbGVjdGVkIGZyb20gbm9kZXMgaW4gdGhlIHRyZWUuCisgICAgICogImZ3b3JkW10iIHRoZSB3b3JkIHdlIGFyZSB0cnlpbmcgdG8gbWF0Y2ggd2l0aCAoaW5pdGlhbGx5IHRoZSBiYWQKKyAgICAgKiB3b3JkKS4KKyAgICAgKi8KKyAgICBkZXB0aCA9IDA7CisgICAgc3AgPSAmc3RhY2tbMF07CisgICAgdmltX21lbXNldChzcCwgMCwgc2l6ZW9mKHRyeXN0YXRlX1QpKTsKKyAgICBzcC0+dHNfY3VyaSA9IDE7CisKKyAgICBpZiAoc291bmRmb2xkKQorICAgIHsKKwkvKiBHb2luZyB0aHJvdWdoIHRoZSBzb3VuZGZvbGQgdHJlZS4gKi8KKwlieXRzID0gZmJ5dHMgPSBzbGFuZy0+c2xfc2J5dHM7CisJaWR4cyA9IGZpZHhzID0gc2xhbmctPnNsX3NpZHhzOworCXBieXRzID0gTlVMTDsKKwlwaWR4cyA9IE5VTEw7CisJc3AtPnRzX3ByZWZpeGRlcHRoID0gUEZEX05PUFJFRklYOworCXNwLT50c19zdGF0ZSA9IFNUQVRFX1NUQVJUOworICAgIH0KKyAgICBlbHNlCisgICAgewogCS8qCiAJICogV2hlbiB0aGVyZSBhcmUgcG9zdHBvbmVkIHByZWZpeGVzIHdlIG5lZWQgdG8gdXNlIHRoZXNlIGZpcnN0LiAgQXQKIAkgKiB0aGUgZW5kIG9mIHRoZSBwcmVmaXggd2UgY29udGludWUgaW4gdGhlIGNhc2UtZm9sZCB0cmVlLgpAQCAtOTMzMCwyMzIgKzEwNTc1LDI0MyBAQAogCSAgICBzcC0+dHNfcHJlZml4ZGVwdGggPSBQRkRfTk9QUkVGSVg7CiAJICAgIHNwLT50c19zdGF0ZSA9IFNUQVRFX1NUQVJUOwogCX0KKyAgICB9CiAKLQkvKgotCSAqIExvb3AgdG8gZmluZCBhbGwgc3VnZ2VzdGlvbnMuICBBdCBlYWNoIHJvdW5kIHdlIGVpdGhlcjoKLQkgKiAtIEZvciB0aGUgY3VycmVudCBzdGF0ZSB0cnkgb25lIG9wZXJhdGlvbiwgYWR2YW5jZSAidHNfY3VyaSIsCi0JICogICBpbmNyZWFzZSAiZGVwdGgiLgotCSAqIC0gV2hlbiBhIHN0YXRlIGlzIGRvbmUgZ28gdG8gdGhlIG5leHQsIHNldCAidHNfc3RhdGUiLgotCSAqIC0gV2hlbiBhbGwgc3RhdGVzIGFyZSB0cmllZCBkZWNyZWFzZSAiZGVwdGgiLgotCSAqLwotCXdoaWxlIChkZXB0aCA+PSAwICYmICFnb3RfaW50KQorICAgIC8qCisgICAgICogTG9vcCB0byBmaW5kIGFsbCBzdWdnZXN0aW9ucy4gIEF0IGVhY2ggcm91bmQgd2UgZWl0aGVyOgorICAgICAqIC0gRm9yIHRoZSBjdXJyZW50IHN0YXRlIHRyeSBvbmUgb3BlcmF0aW9uLCBhZHZhbmNlICJ0c19jdXJpIiwKKyAgICAgKiAgIGluY3JlYXNlICJkZXB0aCIuCisgICAgICogLSBXaGVuIGEgc3RhdGUgaXMgZG9uZSBnbyB0byB0aGUgbmV4dCwgc2V0ICJ0c19zdGF0ZSIuCisgICAgICogLSBXaGVuIGFsbCBzdGF0ZXMgYXJlIHRyaWVkIGRlY3JlYXNlICJkZXB0aCIuCisgICAgICovCisgICAgd2hpbGUgKGRlcHRoID49IDAgJiYgIWdvdF9pbnQpCisgICAgeworCXNwID0gJnN0YWNrW2RlcHRoXTsKKwlzd2l0Y2ggKHNwLT50c19zdGF0ZSkKIAl7Ci0JICAgIHNwID0gJnN0YWNrW2RlcHRoXTsKLQkgICAgc3dpdGNoIChzcC0+dHNfc3RhdGUpCisJY2FzZSBTVEFURV9TVEFSVDoKKwljYXNlIFNUQVRFX05PUFJFRklYOgorCSAgICAvKgorCSAgICAgKiBTdGFydCBvZiBub2RlOiBEZWFsIHdpdGggTlVMIGJ5dGVzLCB3aGljaCBtZWFucworCSAgICAgKiB0d29yZFtdIG1heSBlbmQgaGVyZS4KKwkgICAgICovCisJICAgIGFycmlkeCA9IHNwLT50c19hcnJpZHg7CSAgICAvKiBjdXJyZW50IG5vZGUgaW4gdGhlIHRyZWUgKi8KKwkgICAgbGVuID0gYnl0c1thcnJpZHhdOwkJICAgIC8qIGJ5dGVzIGluIHRoaXMgbm9kZSAqLworCSAgICBhcnJpZHggKz0gc3AtPnRzX2N1cmk7CSAgICAvKiBpbmRleCBvZiBjdXJyZW50IGJ5dGUgKi8KKworCSAgICBpZiAoc3AtPnRzX3ByZWZpeGRlcHRoID09IFBGRF9QUkVGSVhUUkVFKQogCSAgICB7Ci0JICAgIGNhc2UgU1RBVEVfU1RBUlQ6Ci0JICAgIGNhc2UgU1RBVEVfTk9QUkVGSVg6Ci0JCS8qCi0JCSAqIFN0YXJ0IG9mIG5vZGU6IERlYWwgd2l0aCBOVUwgYnl0ZXMsIHdoaWNoIG1lYW5zCi0JCSAqIHR3b3JkW10gbWF5IGVuZCBoZXJlLgotCQkgKi8KLQkJYXJyaWR4ID0gc3AtPnRzX2FycmlkeDsJICAgIC8qIGN1cnJlbnQgbm9kZSBpbiB0aGUgdHJlZSAqLwotCQlsZW4gPSBieXRzW2FycmlkeF07CSAgICAvKiBieXRlcyBpbiB0aGlzIG5vZGUgKi8KLQkJYXJyaWR4ICs9IHNwLT50c19jdXJpOwkgICAgLyogaW5kZXggb2YgY3VycmVudCBieXRlICovCisJCS8qIFNraXAgb3ZlciB0aGUgTlVMIGJ5dGVzLCB3ZSB1c2UgdGhlbSBsYXRlci4gKi8KKwkJZm9yIChuID0gMDsgbiA8IGxlbiAmJiBieXRzW2FycmlkeCArIG5dID09IDA7ICsrbikKKwkJICAgIDsKKwkJc3AtPnRzX2N1cmkgKz0gbjsKIAotCQlpZiAoc3AtPnRzX3ByZWZpeGRlcHRoID09IFBGRF9QUkVGSVhUUkVFKQorCQkvKiBBbHdheXMgcGFzdCBOVUwgYnl0ZXMgbm93LiAqLworCQluID0gKGludClzcC0+dHNfc3RhdGU7CisJCXNwLT50c19zdGF0ZSA9IFNUQVRFX0VORE5VTDsKKwkJc3AtPnRzX3NhdmVfYmFkZmxhZ3MgPSBzdS0+c3VfYmFkZmxhZ3M7CisKKwkJLyogQXQgZW5kIG9mIGEgcHJlZml4IG9yIGF0IHN0YXJ0IG9mIHByZWZpeHRyZWU6IGNoZWNrIGZvcgorCQkgKiBmb2xsb3dpbmcgd29yZC4gKi8KKwkJaWYgKGJ5dHNbYXJyaWR4XSA9PSAwIHx8IG4gPT0gKGludClTVEFURV9OT1BSRUZJWCkKIAkJewotCQkgICAgLyogU2tpcCBvdmVyIHRoZSBOVUwgYnl0ZXMsIHdlIHVzZSB0aGVtIGxhdGVyLiAqLwotCQkgICAgZm9yIChuID0gMDsgbiA8IGxlbiAmJiBieXRzW2FycmlkeCArIG5dID09IDA7ICsrbikKLQkJCTsKLQkJICAgIHNwLT50c19jdXJpICs9IG47Ci0KLQkJICAgIC8qIEFsd2F5cyBwYXN0IE5VTCBieXRlcyBub3cuICovCi0JCSAgICBuID0gKGludClzcC0+dHNfc3RhdGU7Ci0JCSAgICBzcC0+dHNfc3RhdGUgPSBTVEFURV9FTkROVUw7Ci0JCSAgICBzcC0+dHNfc2F2ZV9iYWRmbGFncyA9IHN1LT5zdV9iYWRmbGFnczsKLQotCQkgICAgLyogQXQgZW5kIG9mIGEgcHJlZml4IG9yIGF0IHN0YXJ0IG9mIHByZWZpeHRyZWU6IGNoZWNrIGZvcgotCQkgICAgICogZm9sbG93aW5nIHdvcmQuICovCi0JCSAgICBpZiAoYnl0c1thcnJpZHhdID09IDAgfHwgbiA9PSAoaW50KVNUQVRFX05PUFJFRklYKQotCQkgICAgewotCQkJLyogU2V0IHN1LT5zdV9iYWRmbGFncyB0byB0aGUgY2FwcyB0eXBlIGF0IHRoaXMKLQkJCSAqIHBvc2l0aW9uLiAgVXNlIHRoZSBjYXBzIHR5cGUgdW50aWwgaGVyZSBmb3IgdGhlCi0JCQkgKiBwcmVmaXggaXRzZWxmLiAqLworCQkgICAgLyogU2V0IHN1LT5zdV9iYWRmbGFncyB0byB0aGUgY2FwcyB0eXBlIGF0IHRoaXMgcG9zaXRpb24uCisJCSAgICAgKiBVc2UgdGhlIGNhcHMgdHlwZSB1bnRpbCBoZXJlIGZvciB0aGUgcHJlZml4IGl0c2VsZi4gKi8KICNpZmRlZiBGRUFUX01CWVRFCi0JCQlpZiAoaGFzX21ieXRlKQotCQkJICAgIG4gPSBub2ZvbGRfbGVuKGZ3b3JkLCBzcC0+dHNfZmlkeCwgc3UtPnN1X2JhZHB0cik7Ci0JCQllbHNlCisJCSAgICBpZiAoaGFzX21ieXRlKQorCQkJbiA9IG5vZm9sZF9sZW4oZndvcmQsIHNwLT50c19maWR4LCBzdS0+c3VfYmFkcHRyKTsKKwkJICAgIGVsc2UKICNlbmRpZgotCQkJICAgIG4gPSBzcC0+dHNfZmlkeDsKLQkJCWZsYWdzID0gYmFkd29yZF9jYXB0eXBlKHN1LT5zdV9iYWRwdHIsCi0JCQkJCQkJICAgc3UtPnN1X2JhZHB0ciArIG4pOwotCQkJc3UtPnN1X2JhZGZsYWdzID0gYmFkd29yZF9jYXB0eXBlKHN1LT5zdV9iYWRwdHIgKyBuLAorCQkJbiA9IHNwLT50c19maWR4OworCQkgICAgZmxhZ3MgPSBiYWR3b3JkX2NhcHR5cGUoc3UtPnN1X2JhZHB0ciwgc3UtPnN1X2JhZHB0ciArIG4pOworCQkgICAgc3UtPnN1X2JhZGZsYWdzID0gYmFkd29yZF9jYXB0eXBlKHN1LT5zdV9iYWRwdHIgKyBuLAogCQkJCQkgICAgICAgc3UtPnN1X2JhZHB0ciArIHN1LT5zdV9iYWRsZW4pOwotCQkJKytkZXB0aDsKLQkJCXN0YWNrW2RlcHRoXSA9IHN0YWNrW2RlcHRoIC0gMV07Ci0JCQlzcCA9ICZzdGFja1tkZXB0aF07Ci0JCQlzcC0+dHNfcHJlZml4ZGVwdGggPSBkZXB0aCAtIDE7Ci0JCQlieXRzID0gZmJ5dHM7Ci0JCQlpZHhzID0gZmlkeHM7Ci0JCQlzcC0+dHNfc3RhdGUgPSBTVEFURV9TVEFSVDsKLQkJCXNwLT50c19jdXJpID0gMTsgICAvKiBzdGFydCBqdXN0IGFmdGVyIGxlbmd0aCBieXRlICovCi0JCQlzcC0+dHNfYXJyaWR4ID0gMDsKKyNpZmRlZiBERUJVR19UUklFV0FMSworCQkgICAgc3ByaW50ZihjaGFuZ2VuYW1lW2RlcHRoXSwgInByZWZpeCIpOworI2VuZGlmCisJCSAgICBnb19kZWVwZXIoc3RhY2ssIGRlcHRoLCAwKTsKKwkJICAgICsrZGVwdGg7CisJCSAgICBzcCA9ICZzdGFja1tkZXB0aF07CisJCSAgICBzcC0+dHNfcHJlZml4ZGVwdGggPSBkZXB0aCAtIDE7CisJCSAgICBieXRzID0gZmJ5dHM7CisJCSAgICBpZHhzID0gZmlkeHM7CisJCSAgICBzcC0+dHNfYXJyaWR4ID0gMDsKIAotCQkJLyogTW92ZSB0aGUgcHJlZml4IHRvIHByZXdvcmRbXSB3aXRoIHRoZSByaWdodCBjYXNlCi0JCQkgKiBhbmQgbWFrZSBmaW5kX2tlZXBjYXBfd29yZCgpIHdvcmtzLiAqLwotCQkJdHdvcmRbc3AtPnRzX3R3b3JkbGVuXSA9IE5VTDsKLQkJCW1ha2VfY2FzZV93b3JkKHR3b3JkICsgc3AtPnRzX3NwbGl0b2ZmLAotCQkJCQkJICBwcmV3b3JkICsgc3AtPnRzX3ByZXdvcmRsZW4sCi0JCQkJCQkJCSAgICAgICBmbGFncyk7Ci0JCQlzcC0+dHNfcHJld29yZGxlbiA9IFNUUkxFTihwcmV3b3JkKTsKLQkJCXNwLT50c19zcGxpdG9mZiA9IHNwLT50c190d29yZGxlbjsKLQkJICAgIH0KLQkJICAgIGJyZWFrOworCQkgICAgLyogTW92ZSB0aGUgcHJlZml4IHRvIHByZXdvcmRbXSB3aXRoIHRoZSByaWdodCBjYXNlCisJCSAgICAgKiBhbmQgbWFrZSBmaW5kX2tlZXBjYXBfd29yZCgpIHdvcmtzLiAqLworCQkgICAgdHdvcmRbc3AtPnRzX3R3b3JkbGVuXSA9IE5VTDsKKwkJICAgIG1ha2VfY2FzZV93b3JkKHR3b3JkICsgc3AtPnRzX3NwbGl0b2ZmLAorCQkJCQkgIHByZXdvcmQgKyBzcC0+dHNfcHJld29yZGxlbiwgZmxhZ3MpOworCQkgICAgc3AtPnRzX3ByZXdvcmRsZW4gPSBTVFJMRU4ocHJld29yZCk7CisJCSAgICBzcC0+dHNfc3BsaXRvZmYgPSBzcC0+dHNfdHdvcmRsZW47CiAJCX0KKwkJYnJlYWs7CisJICAgIH0KIAotCQlpZiAoc3AtPnRzX2N1cmkgPiBsZW4gfHwgYnl0c1thcnJpZHhdICE9IDApCi0JCXsKLQkJICAgIC8qIFBhc3QgYnl0ZXMgaW4gbm9kZSBhbmQvb3IgcGFzdCBOVUwgYnl0ZXMuICovCi0JCSAgICBzcC0+dHNfc3RhdGUgPSBTVEFURV9FTkROVUw7Ci0JCSAgICBzcC0+dHNfc2F2ZV9iYWRmbGFncyA9IHN1LT5zdV9iYWRmbGFnczsKLQkJICAgIGJyZWFrOwotCQl9CisJICAgIGlmIChzcC0+dHNfY3VyaSA+IGxlbiB8fCBieXRzW2FycmlkeF0gIT0gMCkKKwkgICAgeworCQkvKiBQYXN0IGJ5dGVzIGluIG5vZGUgYW5kL29yIHBhc3QgTlVMIGJ5dGVzLiAqLworCQlzcC0+dHNfc3RhdGUgPSBTVEFURV9FTkROVUw7CisJCXNwLT50c19zYXZlX2JhZGZsYWdzID0gc3UtPnN1X2JhZGZsYWdzOworCQlicmVhazsKKwkgICAgfQogCi0JCS8qCi0JCSAqIEVuZCBvZiB3b3JkIGluIHRyZWUuCi0JCSAqLwotCQkrK3NwLT50c19jdXJpOwkJLyogZWF0IG9uZSBOVUwgYnl0ZSAqLworCSAgICAvKgorCSAgICAgKiBFbmQgb2Ygd29yZCBpbiB0cmVlLgorCSAgICAgKi8KKwkgICAgKytzcC0+dHNfY3VyaTsJCS8qIGVhdCBvbmUgTlVMIGJ5dGUgKi8KIAotCQlmbGFncyA9IChpbnQpaWR4c1thcnJpZHhdOwotCQlmd29yZF9lbmRzID0gKGZ3b3JkW3NwLT50c19maWR4XSA9PSBOVUwKLQkJCSAgICAgICB8fCAhc3BlbGxfaXN3b3JkcChmd29yZCArIHNwLT50c19maWR4LCBjdXJidWYpKTsKLQkJdHdvcmRbc3AtPnRzX3R3b3JkbGVuXSA9IE5VTDsKKwkgICAgZmxhZ3MgPSAoaW50KWlkeHNbYXJyaWR4XTsKKwkgICAgZndvcmRfZW5kcyA9IChmd29yZFtzcC0+dHNfZmlkeF0gPT0gTlVMCisJCQkgICB8fCAoc291bmRmb2xkCisJCQkgICAgICAgPyB2aW1faXN3aGl0ZShmd29yZFtzcC0+dHNfZmlkeF0pCisJCQkgICAgICAgOiAhc3BlbGxfaXN3b3JkcChmd29yZCArIHNwLT50c19maWR4LCBjdXJidWYpKSk7CisJICAgIHR3b3JkW3NwLT50c190d29yZGxlbl0gPSBOVUw7CiAKLQkJaWYgKHNwLT50c19wcmVmaXhkZXB0aCA8PSBQRkRfTk9UU1BFQ0lBTAorCSAgICBpZiAoc3AtPnRzX3ByZWZpeGRlcHRoIDw9IFBGRF9OT1RTUEVDSUFMCiAJCQkJCSYmIChzcC0+dHNfZmxhZ3MgJiBUU0ZfUFJFRklYT0spID09IDApCisJICAgIHsKKwkJLyogVGhlcmUgd2FzIGEgcHJlZml4IGJlZm9yZSB0aGUgd29yZC4gIENoZWNrIHRoYXQgdGhlIHByZWZpeAorCQkgKiBjYW4gYmUgdXNlZCB3aXRoIHRoaXMgd29yZC4gKi8KKwkJLyogQ291bnQgdGhlIGxlbmd0aCBvZiB0aGUgTlVMcyBpbiB0aGUgcHJlZml4LiAgSWYgdGhlcmUgYXJlCisJCSAqIG5vbmUgdGhpcyBtdXN0IGJlIHRoZSBmaXJzdCB0cnkgd2l0aG91dCBhIHByZWZpeC4gICovCisJCW4gPSBzdGFja1tzcC0+dHNfcHJlZml4ZGVwdGhdLnRzX2FycmlkeDsKKwkJbGVuID0gcGJ5dHNbbisrXTsKKwkJZm9yIChjID0gMDsgYyA8IGxlbiAmJiBwYnl0c1tuICsgY10gPT0gMDsgKytjKQorCQkgICAgOworCQlpZiAoYyA+IDApCiAJCXsKLQkJICAgIC8qIFRoZXJlIHdhcyBhIHByZWZpeCBiZWZvcmUgdGhlIHdvcmQuICBDaGVjayB0aGF0IHRoZQotCQkgICAgICogcHJlZml4IGNhbiBiZSB1c2VkIHdpdGggdGhpcyB3b3JkLiAqLwotCQkgICAgLyogQ291bnQgdGhlIGxlbmd0aCBvZiB0aGUgTlVMcyBpbiB0aGUgcHJlZml4LiAgSWYgdGhlcmUKLQkJICAgICAqIGFyZSBub25lIHRoaXMgbXVzdCBiZSB0aGUgZmlyc3QgdHJ5IHdpdGhvdXQgYSBwcmVmaXguCi0JCSAgICAgKi8KLQkJICAgIG4gPSBzdGFja1tzcC0+dHNfcHJlZml4ZGVwdGhdLnRzX2FycmlkeDsKLQkJICAgIGxlbiA9IHBieXRzW24rK107Ci0JCSAgICBmb3IgKGMgPSAwOyBjIDwgbGVuICYmIHBieXRzW24gKyBjXSA9PSAwOyArK2MpCi0JCQk7Ci0JCSAgICBpZiAoYyA+IDApCi0JCSAgICB7Ci0JCQljID0gdmFsaWRfd29yZF9wcmVmaXgoYywgbiwgZmxhZ3MsCisJCSAgICBjID0gdmFsaWRfd29yZF9wcmVmaXgoYywgbiwgZmxhZ3MsCiAJCQkJICAgICAgIHR3b3JkICsgc3AtPnRzX3NwbGl0b2ZmLCBzbGFuZywgRkFMU0UpOwotCQkJaWYgKGMgPT0gMCkKLQkJCSAgICBicmVhazsKKwkJICAgIGlmIChjID09IDApCisJCQlicmVhazsKIAotCQkJLyogVXNlIHRoZSBXRl9SQVJFIGZsYWcgZm9yIGEgcmFyZSBwcmVmaXguICovCi0JCQlpZiAoYyAmIFdGX1JBUkVQRlgpCi0JCQkgICAgZmxhZ3MgfD0gV0ZfUkFSRTsKKwkJICAgIC8qIFVzZSB0aGUgV0ZfUkFSRSBmbGFnIGZvciBhIHJhcmUgcHJlZml4LiAqLworCQkgICAgaWYgKGMgJiBXRl9SQVJFUEZYKQorCQkJZmxhZ3MgfD0gV0ZfUkFSRTsKIAotCQkJLyogVHJpY2t5OiB3aGVuIGNoZWNraW5nIGZvciBib3RoIHByZWZpeCBhbmQKLQkJCSAqIGNvbXBvdW5kaW5nIHdlIHJ1biBpbnRvIHRoZSBwcmVmaXggZmxhZyBmaXJzdC4KLQkJCSAqIFJlbWVtYmVyIHRoYXQgaXQncyBPSywgc28gdGhhdCB3ZSBhY2NlcHQgdGhlIHByZWZpeAotCQkJICogd2hlbiBhcnJpdmluZyBhdCBhIGNvbXBvdW5kIGZsYWcuICovCi0JCQlzcC0+dHNfZmxhZ3MgfD0gVFNGX1BSRUZJWE9LOwotCQkgICAgfQorCQkgICAgLyogVHJpY2t5OiB3aGVuIGNoZWNraW5nIGZvciBib3RoIHByZWZpeCBhbmQgY29tcG91bmRpbmcKKwkJICAgICAqIHdlIHJ1biBpbnRvIHRoZSBwcmVmaXggZmxhZyBmaXJzdC4KKwkJICAgICAqIFJlbWVtYmVyIHRoYXQgaXQncyBPSywgc28gdGhhdCB3ZSBhY2NlcHQgdGhlIHByZWZpeAorCQkgICAgICogd2hlbiBhcnJpdmluZyBhdCBhIGNvbXBvdW5kIGZsYWcuICovCisJCSAgICBzcC0+dHNfZmxhZ3MgfD0gVFNGX1BSRUZJWE9LOwogCQl9CisJICAgIH0KIAotCQkvKiBDaGVjayBORUVEQ09NUE9VTkQ6IGNhbid0IHVzZSB3b3JkIHdpdGhvdXQgY29tcG91bmRpbmcuICBEbwotCQkgKiB0cnkgYXBwZW5kaW5nIGFub3RoZXIgY29tcG91bmQgd29yZCBiZWxvdy4gKi8KLQkJaWYgKHNwLT50c19jb21wbGVuID09IHNwLT50c19jb21wc3BsaXQgJiYgZndvcmRfZW5kcworCSAgICAvKiBDaGVjayBORUVEQ09NUE9VTkQ6IGNhbid0IHVzZSB3b3JkIHdpdGhvdXQgY29tcG91bmRpbmcuICBEbyB0cnkKKwkgICAgICogYXBwZW5kaW5nIGFub3RoZXIgY29tcG91bmQgd29yZCBiZWxvdy4gKi8KKwkgICAgaWYgKHNwLT50c19jb21wbGVuID09IHNwLT50c19jb21wc3BsaXQgJiYgZndvcmRfZW5kcwogCQkJCQkJICAgICAmJiAoZmxhZ3MgJiBXRl9ORUVEQ09NUCkpCi0JCSAgICBnb29kd29yZF9lbmRzID0gRkFMU0U7Ci0JCWVsc2UKLQkJICAgIGdvb2R3b3JkX2VuZHMgPSBUUlVFOworCQlnb29kd29yZF9lbmRzID0gRkFMU0U7CisJICAgIGVsc2UKKwkJZ29vZHdvcmRfZW5kcyA9IFRSVUU7CiAKLQkJaWYgKHNwLT50c19jb21wbGVuID4gc3AtPnRzX2NvbXBzcGxpdCkKKwkgICAgcCA9IE5VTEw7CisJICAgIGNvbXBvdW5kX29rID0gVFJVRTsKKwkgICAgaWYgKHNwLT50c19jb21wbGVuID4gc3AtPnRzX2NvbXBzcGxpdCkKKwkgICAgeworCQlpZiAoc2xhbmctPnNsX25vYnJlYWspCiAJCXsKLQkJICAgIGlmIChzbGFuZy0+c2xfbm9icmVhaykKLQkJICAgIHsKLQkJCS8qIFRoZXJlIHdhcyBhIHdvcmQgYmVmb3JlIHRoaXMgd29yZC4gIFdoZW4gdGhlcmUgd2FzCi0JCQkgKiBubyBjaGFuZ2UgaW4gdGhpcyB3b3JkIChpdCB3YXMgY29ycmVjdCkgYWRkIHRoZQotCQkJICogZmlyc3Qgd29yZCBhcyBhIHN1Z2dlc3Rpb24uICBJZiB0aGlzIHdvcmQgd2FzCi0JCQkgKiBjb3JyZWN0ZWQgdG9vLCB3ZSBuZWVkIHRvIGNoZWNrIGlmIGEgY29ycmVjdCB3b3JkCi0JCQkgKiBmb2xsb3dzLiAqLwotCQkJaWYgKHNwLT50c19maWR4IC0gc3AtPnRzX3NwbGl0ZmlkeAorCQkgICAgLyogVGhlcmUgd2FzIGEgd29yZCBiZWZvcmUgdGhpcyB3b3JkLiAgV2hlbiB0aGVyZSB3YXMgbm8KKwkJICAgICAqIGNoYW5nZSBpbiB0aGlzIHdvcmQgKGl0IHdhcyBjb3JyZWN0KSBhZGQgdGhlIGZpcnN0IHdvcmQKKwkJICAgICAqIGFzIGEgc3VnZ2VzdGlvbi4gIElmIHRoaXMgd29yZCB3YXMgY29ycmVjdGVkIHRvbywgd2UKKwkJICAgICAqIG5lZWQgdG8gY2hlY2sgaWYgYSBjb3JyZWN0IHdvcmQgZm9sbG93cy4gKi8KKwkJICAgIGlmIChzcC0+dHNfZmlkeCAtIHNwLT50c19zcGxpdGZpZHgKIAkJCQkJICA9PSBzcC0+dHNfdHdvcmRsZW4gLSBzcC0+dHNfc3BsaXRvZmYKLQkJCQkmJiBTVFJOQ01QKGZ3b3JkICsgc3AtPnRzX3NwbGl0ZmlkeCwKLQkJCQkJICAgIHR3b3JkICsgc3AtPnRzX3NwbGl0b2ZmLAorCQkJICAgICYmIFNUUk5DTVAoZndvcmQgKyBzcC0+dHNfc3BsaXRmaWR4LAorCQkJCQl0d29yZCArIHNwLT50c19zcGxpdG9mZiwKIAkJCQkJIHNwLT50c19maWR4IC0gc3AtPnRzX3NwbGl0ZmlkeCkgPT0gMCkKLQkJCXsKLQkJCSAgICBwcmV3b3JkW3NwLT50c19wcmV3b3JkbGVuXSA9IE5VTDsKKwkJICAgIHsKKwkJCXByZXdvcmRbc3AtPnRzX3ByZXdvcmRsZW5dID0gTlVMOworCQkJbmV3c2NvcmUgPSBzY29yZV93b3JkY291bnRfYWRqKHNsYW5nLCBzcC0+dHNfc2NvcmUsCisJCQkJCQkgcHJld29yZCArIHNwLT50c19wcmV3b3JkbGVuLAorCQkJCQkJIHNwLT50c19wcmV3b3JkbGVuID4gMCk7CisJCQkvKiBBZGQgdGhlIHN1Z2dlc3Rpb24gaWYgdGhlIHNjb3JlIGlzbid0IHRvbyBiYWQuICovCisJCQlpZiAobmV3c2NvcmUgPD0gc3UtPnN1X21heHNjb3JlKQogCQkJICAgIGFkZF9zdWdnZXN0aW9uKHN1LCAmc3UtPnN1X2dhLCBwcmV3b3JkLAogCQkJCSAgICBzcC0+dHNfc3BsaXRmaWR4IC0gcmVwZXh0cmEsCi0JCQkJICAgIHNwLT50c19zY29yZSwgMCwgRkFMU0UsCi0JCQkJICAgIGxwLT5scF9zYWxsYW5nKTsKLQkJCSAgICBicmVhazsKLQkJCX0KLQkJICAgIH0KLQkJICAgIGVsc2UKLQkJICAgIHsKLQkJCS8qIFRoZXJlIHdhcyBhIGNvbXBvdW5kIHdvcmQgYmVmb3JlIHRoaXMgd29yZC4gIElmCi0JCQkgKiB0aGlzIHdvcmQgZG9lcyBub3Qgc3VwcG9ydCBjb21wb3VuZGluZyB0aGVuIGdpdmUgdXAKLQkJCSAqIChzcGxpdHRpbmcgaXMgdHJpZWQgZm9yIHRoZSB3b3JkIHdpdGhvdXQgY29tcG91bmQKLQkJCSAqIGZsYWcpLiAqLwotCQkJaWYgKCgodW5zaWduZWQpZmxhZ3MgPj4gMjQpID09IDAKLQkJCQl8fCBzcC0+dHNfdHdvcmRsZW4gLSBzcC0+dHNfc3BsaXRvZmYKLQkJCQkJCSAgICAgICA8IHNsYW5nLT5zbF9jb21wbWlubGVuKQotCQkJICAgIGJyZWFrOwotI2lmZGVmIEZFQVRfTUJZVEUKLQkJCS8qIEZvciBtdWx0aS1ieXRlIGNoYXJzIGNoZWNrIGNoYXJhY3RlciBsZW5ndGggYWdhaW5zdAotCQkJICogQ09NUE9VTkRNSU4uICovCi0JCQlpZiAoaGFzX21ieXRlCi0JCQkJJiYgc2xhbmctPnNsX2NvbXBtaW5sZW4gPiAwCi0JCQkJJiYgbWJfY2hhcmxlbih0d29yZCArIHNwLT50c19zcGxpdG9mZikKLQkJCQkJCSAgICAgICA8IHNsYW5nLT5zbF9jb21wbWlubGVuKQotCQkJICAgIGJyZWFrOwotI2VuZGlmCi0KLQkJCWNvbXBmbGFnc1tzcC0+dHNfY29tcGxlbl0gPSAoKHVuc2lnbmVkKWZsYWdzID4+IDI0KTsKLQkJCWNvbXBmbGFnc1tzcC0+dHNfY29tcGxlbiArIDFdID0gTlVMOwotCQkJdmltX3N0cm5jcHkocHJld29yZCArIHNwLT50c19wcmV3b3JkbGVuLAotCQkJCXR3b3JkICsgc3AtPnRzX3NwbGl0b2ZmLAotCQkJCXNwLT50c190d29yZGxlbiAtIHNwLT50c19zcGxpdG9mZik7Ci0JCQlwID0gcHJld29yZDsKLQkJCXdoaWxlICgqc2tpcHRvd2hpdGUocCkgIT0gTlVMKQotCQkJICAgIHAgPSBza2lwd2hpdGUoc2tpcHRvd2hpdGUocCkpOwotCQkJaWYgKGZ3b3JkX2VuZHMgJiYgIWNhbl9jb21wb3VuZChzbGFuZywgcCwKLQkJCQkJCWNvbXBmbGFncyArIHNwLT50c19jb21wc3BsaXQpKQotCQkJICAgIGJyZWFrOwotCi0JCQkvKiBHZXQgcG9pbnRlciB0byBsYXN0IGNoYXIgb2YgcHJldmlvdXMgd29yZC4gKi8KLQkJCXAgPSBwcmV3b3JkICsgc3AtPnRzX3ByZXdvcmRsZW47Ci0JCQltYl9wdHJfYmFjayhwcmV3b3JkLCBwKTsKKwkJCQkgICAgbmV3c2NvcmUsIDAsIEZBTFNFLAorCQkJCSAgICBscC0+bHBfc2FsbGFuZywgRkFMU0UpOworCQkJYnJlYWs7CiAJCSAgICB9CiAJCX0KIAkJZWxzZQotCQkgICAgcCA9IE5VTEw7Ci0KLQkJLyoKLQkJICogRm9ybSB0aGUgd29yZCB3aXRoIHByb3BlciBjYXNlIGluIHByZXdvcmQuCi0JCSAqIElmIHRoZXJlIGlzIGEgd29yZCBmcm9tIGEgcHJldmlvdXMgc3BsaXQsIGFwcGVuZC4KLQkJICovCi0JCWlmIChmbGFncyAmIFdGX0tFRVBDQVApCi0JCSAgICAvKiBNdXN0IGZpbmQgdGhlIHdvcmQgaW4gdGhlIGtlZXAtY2FzZSB0cmVlLiAqLwotCQkgICAgZmluZF9rZWVwY2FwX3dvcmQoc2xhbmcsIHR3b3JkICsgc3AtPnRzX3NwbGl0b2ZmLAotCQkJCQkJIHByZXdvcmQgKyBzcC0+dHNfcHJld29yZGxlbik7Ci0JCWVsc2UKIAkJewotCQkgICAgLyogSW5jbHVkZSBiYWRmbGFnczogaWYgdGhlIGJhZHdvcmQgaXMgb25lY2FwIG9yIGFsbGNhcAotCQkgICAgICogdXNlIHRoYXQgZm9yIHRoZSBnb29kd29yZCB0b28uICBCdXQgaWYgdGhlIGJhZHdvcmQgaXMKLQkJICAgICAqIGFsbGNhcCBhbmQgaXQncyBvbmx5IG9uZSBjaGFyIGxvbmcgdXNlIG9uZWNhcC4gKi8KLQkJICAgIGMgPSBzdS0+c3VfYmFkZmxhZ3M7Ci0JCSAgICBpZiAoKGMgJiBXRl9BTExDQVApCisJCSAgICAvKiBUaGVyZSB3YXMgYSBjb21wb3VuZCB3b3JkIGJlZm9yZSB0aGlzIHdvcmQuICBJZiB0aGlzCisJCSAgICAgKiB3b3JkIGRvZXMgbm90IHN1cHBvcnQgY29tcG91bmRpbmcgdGhlbiBnaXZlIHVwCisJCSAgICAgKiAoc3BsaXR0aW5nIGlzIHRyaWVkIGZvciB0aGUgd29yZCB3aXRob3V0IGNvbXBvdW5kCisJCSAgICAgKiBmbGFnKS4gKi8KKwkJICAgIGlmICgoKHVuc2lnbmVkKWZsYWdzID4+IDI0KSA9PSAwCisJCQkgICAgfHwgc3AtPnRzX3R3b3JkbGVuIC0gc3AtPnRzX3NwbGl0b2ZmCisJCQkJCQkgICAgICAgPCBzbGFuZy0+c2xfY29tcG1pbmxlbikKKwkJCWJyZWFrOwogI2lmZGVmIEZFQVRfTUJZVEUKLQkJCSAgICAmJiBzdS0+c3VfYmFkbGVuID09ICgqbWJfcHRyMmxlbikoc3UtPnN1X2JhZHB0cikKLSNlbHNlCi0JCQkgICAgJiYgc3UtPnN1X2JhZGxlbiA9PSAxCisJCSAgICAvKiBGb3IgbXVsdGktYnl0ZSBjaGFycyBjaGVjayBjaGFyYWN0ZXIgbGVuZ3RoIGFnYWluc3QKKwkJICAgICAqIENPTVBPVU5ETUlOLiAqLworCQkgICAgaWYgKGhhc19tYnl0ZQorCQkJICAgICYmIHNsYW5nLT5zbF9jb21wbWlubGVuID4gMAorCQkJICAgICYmIG1iX2NoYXJsZW4odHdvcmQgKyBzcC0+dHNfc3BsaXRvZmYpCisJCQkJCQkgICAgICAgPCBzbGFuZy0+c2xfY29tcG1pbmxlbikKKwkJCWJyZWFrOwogI2VuZGlmCi0JCQkgICAgKQotCQkJYyA9IFdGX09ORUNBUDsKLQkJICAgIGMgfD0gZmxhZ3M7CiAKLQkJICAgIC8qIFdoZW4gYXBwZW5kaW5nIGEgY29tcG91bmQgd29yZCBhZnRlciBhIHdvcmQgY2hhcmFjdGVyCi0JCSAgICAgKiBkb24ndCB1c2UgT25lY2FwLiAqLwotCQkgICAgaWYgKHAgIT0gTlVMTCAmJiBzcGVsbF9pc3dvcmRwX25tdyhwKSkKLQkJCWMgJj0gfldGX09ORUNBUDsKLQkJICAgIG1ha2VfY2FzZV93b3JkKHR3b3JkICsgc3AtPnRzX3NwbGl0b2ZmLAotCQkJCQkgICAgICBwcmV3b3JkICsgc3AtPnRzX3ByZXdvcmRsZW4sIGMpOworCQkgICAgY29tcGZsYWdzW3NwLT50c19jb21wbGVuXSA9ICgodW5zaWduZWQpZmxhZ3MgPj4gMjQpOworCQkgICAgY29tcGZsYWdzW3NwLT50c19jb21wbGVuICsgMV0gPSBOVUw7CisJCSAgICB2aW1fc3RybmNweShwcmV3b3JkICsgc3AtPnRzX3ByZXdvcmRsZW4sCisJCQkgICAgdHdvcmQgKyBzcC0+dHNfc3BsaXRvZmYsCisJCQkgICAgc3AtPnRzX3R3b3JkbGVuIC0gc3AtPnRzX3NwbGl0b2ZmKTsKKwkJICAgIHAgPSBwcmV3b3JkOworCQkgICAgd2hpbGUgKCpza2lwdG93aGl0ZShwKSAhPSBOVUwpCisJCQlwID0gc2tpcHdoaXRlKHNraXB0b3doaXRlKHApKTsKKwkJICAgIGlmIChmd29yZF9lbmRzICYmICFjYW5fY29tcG91bmQoc2xhbmcsIHAsCisJCQkJCQljb21wZmxhZ3MgKyBzcC0+dHNfY29tcHNwbGl0KSkKKwkJCS8qIENvbXBvdW5kIGlzIG5vdCBhbGxvd2VkLiAgQnV0IGl0IG1heSBzdGlsbCBiZQorCQkJICogcG9zc2libGUgaWYgd2UgYWRkIGFub3RoZXIgKHNob3J0KSB3b3JkLiAqLworCQkJY29tcG91bmRfb2sgPSBGQUxTRTsKKworCQkgICAgLyogR2V0IHBvaW50ZXIgdG8gbGFzdCBjaGFyIG9mIHByZXZpb3VzIHdvcmQuICovCisJCSAgICBwID0gcHJld29yZCArIHNwLT50c19wcmV3b3JkbGVuOworCQkgICAgbWJfcHRyX2JhY2socHJld29yZCwgcCk7CiAJCX0KKwkgICAgfQogCisJICAgIC8qCisJICAgICAqIEZvcm0gdGhlIHdvcmQgd2l0aCBwcm9wZXIgY2FzZSBpbiBwcmV3b3JkLgorCSAgICAgKiBJZiB0aGVyZSBpcyBhIHdvcmQgZnJvbSBhIHByZXZpb3VzIHNwbGl0LCBhcHBlbmQuCisJICAgICAqIEZvciB0aGUgc291bmRmb2xkIHRyZWUgZG9uJ3QgY2hhbmdlIHRoZSBjYXNlLCBzaW1wbHkgYXBwZW5kLgorCSAgICAgKi8KKwkgICAgaWYgKHNvdW5kZm9sZCkKKwkJU1RSQ1BZKHByZXdvcmQgKyBzcC0+dHNfcHJld29yZGxlbiwgdHdvcmQgKyBzcC0+dHNfc3BsaXRvZmYpOworCSAgICBlbHNlIGlmIChmbGFncyAmIFdGX0tFRVBDQVApCisJCS8qIE11c3QgZmluZCB0aGUgd29yZCBpbiB0aGUga2VlcC1jYXNlIHRyZWUuICovCisJCWZpbmRfa2VlcGNhcF93b3JkKHNsYW5nLCB0d29yZCArIHNwLT50c19zcGxpdG9mZiwKKwkJCQkJCSBwcmV3b3JkICsgc3AtPnRzX3ByZXdvcmRsZW4pOworCSAgICBlbHNlCisJICAgIHsKKwkJLyogSW5jbHVkZSBiYWRmbGFnczogSWYgdGhlIGJhZHdvcmQgaXMgb25lY2FwIG9yIGFsbGNhcAorCQkgKiB1c2UgdGhhdCBmb3IgdGhlIGdvb2R3b3JkIHRvby4gIEJ1dCBpZiB0aGUgYmFkd29yZCBpcworCQkgKiBhbGxjYXAgYW5kIGl0J3Mgb25seSBvbmUgY2hhciBsb25nIHVzZSBvbmVjYXAuICovCisJCWMgPSBzdS0+c3VfYmFkZmxhZ3M7CisJCWlmICgoYyAmIFdGX0FMTENBUCkKKyNpZmRlZiBGRUFUX01CWVRFCisJCQkmJiBzdS0+c3VfYmFkbGVuID09ICgqbWJfcHRyMmxlbikoc3UtPnN1X2JhZHB0cikKKyNlbHNlCisJCQkmJiBzdS0+c3VfYmFkbGVuID09IDEKKyNlbmRpZgorCQkJKQorCQkgICAgYyA9IFdGX09ORUNBUDsKKwkJYyB8PSBmbGFnczsKKworCQkvKiBXaGVuIGFwcGVuZGluZyBhIGNvbXBvdW5kIHdvcmQgYWZ0ZXIgYSB3b3JkIGNoYXJhY3RlciBkb24ndAorCQkgKiB1c2UgT25lY2FwLiAqLworCQlpZiAocCAhPSBOVUxMICYmIHNwZWxsX2lzd29yZHBfbm13KHApKQorCQkgICAgYyAmPSB+V0ZfT05FQ0FQOworCQltYWtlX2Nhc2Vfd29yZCh0d29yZCArIHNwLT50c19zcGxpdG9mZiwKKwkJCQkJICAgICAgcHJld29yZCArIHNwLT50c19wcmV3b3JkbGVuLCBjKTsKKwkgICAgfQorCisJICAgIGlmICghc291bmRmb2xkKQorCSAgICB7CiAJCS8qIERvbid0IHVzZSBhIGJhbm5lZCB3b3JkLiAgSXQgbWF5IGFwcGVhciBhZ2FpbiBhcyBhIGdvb2QKIAkJICogd29yZCwgdGh1cyByZW1lbWJlciBpdC4gKi8KIAkJaWYgKGZsYWdzICYgV0ZfQkFOTkVEKQpAQCAtOTU2NCwxNiArMTA4MjAsMTkgQEAKIAkJICAgIGJyZWFrOwogCQl9CiAJCWlmICgoc3AtPnRzX2NvbXBsZW4gPT0gc3AtPnRzX2NvbXBzcGxpdAotCQkJICAgICYmIHdhc19iYW5uZWQoc3UsIHByZXdvcmQgKyBzcC0+dHNfcHJld29yZGxlbikpCi0JCQkJCQkgICB8fCB3YXNfYmFubmVkKHN1LCBwcmV3b3JkKSkKKwkJCSAgICAmJiBXQVNfQkFOTkVEKHN1LCBwcmV3b3JkICsgc3AtPnRzX3ByZXdvcmRsZW4pKQorCQkJCQkJICAgfHwgV0FTX0JBTk5FRChzdSwgcHJld29yZCkpCiAJCXsKIAkJICAgIGlmIChzbGFuZy0+c2xfY29tcHByb2cgPT0gTlVMTCkKIAkJCWJyZWFrOwogCQkgICAgLyogdGhlIHdvcmQgc28gZmFyIHdhcyBiYW5uZWQgYnV0IHdlIG1heSB0cnkgY29tcG91bmRpbmcgKi8KIAkJICAgIGdvb2R3b3JkX2VuZHMgPSBGQUxTRTsKIAkJfQorCSAgICB9CiAKLQkJbmV3c2NvcmUgPSAwOworCSAgICBuZXdzY29yZSA9IDA7CisJICAgIGlmICghc291bmRmb2xkKQkvKiBzb3VuZGZvbGQgd29yZHMgZG9uJ3QgaGF2ZSBmbGFncyAqLworCSAgICB7CiAJCWlmICgoZmxhZ3MgJiBXRl9SRUdJT04pCiAJCQkgICAgJiYgKCgodW5zaWduZWQpZmxhZ3MgPj4gMTYpICYgbHAtPmxwX3JlZ2lvbikgPT0gMCkKIAkJICAgIG5ld3Njb3JlICs9IFNDT1JFX1JFR0lPTjsKQEAgLTk1ODMsMTEzICsxMDg0MiwxNDEgQEAKIAkJaWYgKCFzcGVsbF92YWxpZF9jYXNlKHN1LT5zdV9iYWRmbGFncywKIAkJCQkgIGNhcHR5cGUocHJld29yZCArIHNwLT50c19wcmV3b3JkbGVuLCBOVUxMKSkpCiAJCSAgICBuZXdzY29yZSArPSBTQ09SRV9JQ0FTRTsKKwkgICAgfQogCi0JCW1heXNwbGl0ID0gVFJVRTsKLQkJaWYgKGZ3b3JkX2VuZHMgJiYgZ29vZHdvcmRfZW5kcwotCQkJCQkgICAgICYmIHNwLT50c19maWR4ID49IHNwLT50c19maWR4dHJ5KQorCSAgICAvKiBUT0RPOiBob3cgYWJvdXQgc3BsaXR0aW5nIGluIHRoZSBzb3VuZGZvbGQgdHJlZT8gKi8KKwkgICAgaWYgKGZ3b3JkX2VuZHMKKwkJICAgICYmIGdvb2R3b3JkX2VuZHMKKwkJICAgICYmIHNwLT50c19maWR4ID49IHNwLT50c19maWR4dHJ5CisJCSAgICAmJiBjb21wb3VuZF9vaykKKwkgICAgeworCQkvKiBUaGUgYmFkd29yZCBhbHNvIGVuZHM6IGFkZCBzdWdnZXN0aW9ucy4gKi8KKyNpZmRlZiBERUJVR19UUklFV0FMSworCQlpZiAoc291bmRmb2xkICYmIFNUUkNNUChwcmV3b3JkLCAic213cmQiKSA9PSAwKQogCQl7Ci0JCSAgICAvKiBUaGUgYmFkd29yZCBhbHNvIGVuZHM6IGFkZCBzdWdnZXN0aW9ucy4gIEdpdmUgYSBwZW5hbHR5Ci0JCSAgICAgKiB3aGVuIGNoYW5naW5nIG5vbi13b3JkIGNoYXIgdG8gd29yZCBjaGFyLCBlLmcuLCAidGhlcywiCi0JCSAgICAgKiAtPiAidGhlc2UiLiAqLwotCQkgICAgcCA9IGZ3b3JkICsgc3AtPnRzX2ZpZHg7Ci0jaWZkZWYgRkVBVF9NQllURQotCQkgICAgaWYgKGhhc19tYnl0ZSkKLQkJCW1iX3B0cl9iYWNrKGZ3b3JkLCBwKTsKLQkJICAgIGVsc2UKKwkJICAgIGludAkgICAgajsKKworCQkgICAgLyogcHJpbnQgdGhlIHN0YWNrIG9mIGNoYW5nZXMgdGhhdCBicm91Z2h0IHVzIGhlcmUgKi8KKwkJICAgIHNtc2coIi0tLS0tLSAlcyAtLS0tLS0tIiwgZndvcmQpOworCQkgICAgZm9yIChqID0gMDsgaiA8IGRlcHRoOyArK2opCisJCQlzbXNnKCIlcyIsIGNoYW5nZW5hbWVbal0pOworCQl9CiAjZW5kaWYKLQkJCS0tcDsKKwkJaWYgKHNvdW5kZm9sZCkKKwkJeworCQkgICAgLyogRm9yIHNvdW5kZm9sZGVkIHdvcmRzIHdlIG5lZWQgdG8gZmluZCB0aGUgb3JpZ2luYWwKKwkJICAgICAqIHdvcmRzLCB0aGUgZWRpdCBkaXN0cmFuY2UgYW5kIHRoZW4gYWRkIHRoZW0uICovCisJCSAgICBhZGRfc291bmRfc3VnZ2VzdChzdSwgcHJld29yZCwgc3AtPnRzX3Njb3JlLCBscCk7CisJCX0KKwkJZWxzZQorCQl7CisJCSAgICAvKiBHaXZlIGEgcGVuYWx0eSB3aGVuIGNoYW5naW5nIG5vbi13b3JkIGNoYXIgdG8gd29yZAorCQkgICAgICogY2hhciwgZS5nLiwgInRoZXMsIiAtPiAidGhlc2UiLiAqLworCQkgICAgcCA9IGZ3b3JkICsgc3AtPnRzX2ZpZHg7CisJCSAgICBtYl9wdHJfYmFjayhmd29yZCwgcCk7CiAJCSAgICBpZiAoIXNwZWxsX2lzd29yZHAocCwgY3VyYnVmKSkKIAkJICAgIHsKIAkJCXAgPSBwcmV3b3JkICsgU1RSTEVOKHByZXdvcmQpOwotI2lmZGVmIEZFQVRfTUJZVEUKLQkJCWlmIChoYXNfbWJ5dGUpCi0JCQkgICAgbWJfcHRyX2JhY2socHJld29yZCwgcCk7Ci0JCQllbHNlCi0jZW5kaWYKLQkJCSAgICAtLXA7CisJCQltYl9wdHJfYmFjayhwcmV3b3JkLCBwKTsKIAkJCWlmIChzcGVsbF9pc3dvcmRwKHAsIGN1cmJ1ZikpCiAJCQkgICAgbmV3c2NvcmUgKz0gU0NPUkVfTk9OV09SRDsKIAkJICAgIH0KIAotCQkgICAgYWRkX3N1Z2dlc3Rpb24oc3UsICZzdS0+c3VfZ2EsIHByZXdvcmQsCi0JCQkJCXNwLT50c19maWR4IC0gcmVwZXh0cmEsCi0JCQkJCXNwLT50c19zY29yZSArIG5ld3Njb3JlLCAwLCBGQUxTRSwKLQkJCQkJbHAtPmxwX3NhbGxhbmcpOworCQkgICAgLyogR2l2ZSBhIGJvbnVzIHRvIHdvcmRzIHNlZW4gYmVmb3JlLiAqLworCQkgICAgc2NvcmUgPSBzY29yZV93b3JkY291bnRfYWRqKHNsYW5nLAorCQkJCQkJc3AtPnRzX3Njb3JlICsgbmV3c2NvcmUsCisJCQkJCQlwcmV3b3JkICsgc3AtPnRzX3ByZXdvcmRsZW4sCisJCQkJCQlzcC0+dHNfcHJld29yZGxlbiA+IDApOwogCi0JCSAgICAvKiBXaGVuIHRoZSBiYWQgd29yZCBkb2Vzbid0IGVuZCB5ZXQsIHRyeSBjaGFuZ2luZyB0aGUKLQkJICAgICAqIG5leHQgd29yZC4gIEUuZy4sIGZpbmQgc3VnZ2VzdGlvbnMgZm9yICJ0aGUgdGhlIiB3aGVyZQotCQkgICAgICogdGhlIHNlY29uZCAidGhlIiBpcyBkaWZmZXJlbnQuICBJdCdzIGRvbmUgbGlrZSBhIHNwbGl0LgotCQkgICAgICovCi0JCSAgICBpZiAoc3AtPnRzX2ZpZHggLSByZXBleHRyYSA+PSBzdS0+c3VfYmFkbGVuKQotCQkJbWF5c3BsaXQgPSBGQUxTRTsKKwkJICAgIC8qIEFkZCB0aGUgc3VnZ2VzdGlvbiBpZiB0aGUgc2NvcmUgaXNuJ3QgdG9vIGJhZC4gKi8KKwkJICAgIGlmIChzY29yZSA8PSBzdS0+c3VfbWF4c2NvcmUpCisJCQlhZGRfc3VnZ2VzdGlvbihzdSwgJnN1LT5zdV9nYSwgcHJld29yZCwKKwkJCQkgICAgc3AtPnRzX2ZpZHggLSByZXBleHRyYSwKKwkJCQkgICAgc2NvcmUsIDAsIEZBTFNFLCBscC0+bHBfc2FsbGFuZywgRkFMU0UpOwogCQl9CisJICAgIH0KIAotCQlpZiAobWF5c3BsaXQKLQkJCSYmIChzcC0+dHNfZmlkeCA+PSBzcC0+dHNfZmlkeHRyeSB8fCBmd29yZF9lbmRzKQorCSAgICAvKgorCSAgICAgKiBUcnkgd29yZCBzcGxpdCBhbmQvb3IgY29tcG91bmRpbmcuCisJICAgICAqLworCSAgICBpZiAoKHNwLT50c19maWR4ID49IHNwLT50c19maWR4dHJ5IHx8IGZ3b3JkX2VuZHMpCiAjaWZkZWYgRkVBVF9NQllURQotCQkJLyogRG9uJ3Qgc3BsaXQgaGFsZndheSBhIGNoYXJhY3Rlci4gKi8KLQkJCSYmICghaGFzX21ieXRlIHx8IHNwLT50c190Y2hhcmxlbiA9PSAwKQorCQkgICAgLyogRG9uJ3Qgc3BsaXQgaGFsZndheSBhIGNoYXJhY3Rlci4gKi8KKwkJICAgICYmICghaGFzX21ieXRlIHx8IHNwLT50c190Y2hhcmxlbiA9PSAwKQogI2VuZGlmCi0JCQkpCi0JCXsKLQkJICAgIGludAkgICAgdHJ5X2NvbXBvdW5kOworCQkgICAgKQorCSAgICB7CisJCWludAl0cnlfY29tcG91bmQ7CisJCWludAl0cnlfc3BsaXQ7CiAKLQkJICAgIC8qIEdldCBoZXJlIGluIHR3byBzaXR1YXRpb25zOgotCQkgICAgICogMS4gVGhlIHdvcmQgaW4gdGhlIHRyZWUgZW5kcyBidXQgdGhlIGJhZHdvcmQgY29udGludWVzOgotCQkgICAgICogICAgSWYgdGhlIHdvcmQgYWxsb3dzIGNvbXBvdW5kaW5nIHRyeSB0aGF0LiAgT3RoZXJ3aXNlCi0JCSAgICAgKiAgICB0cnkgYSBzcGxpdCBieSBpbnNlcnRpbmcgYSBzcGFjZS4gIEZvciBib3RoIGNoZWNrCi0JCSAgICAgKiAgICB0aGF0IGEgdmFsaWQgd29yZHMgc3RhcnRzIGF0IGZ3b3JkW3NwLT50c19maWR4XS4KLQkJICAgICAqICAgIEZvciBOT0JSRUFLIGRvIGxpa2UgY29tcG91bmRpbmcgdG8gYmUgYWJsZSB0byBjaGVjawotCQkgICAgICogICAgaWYgdGhlIG5leHQgd29yZCBpcyB2YWxpZC4KLQkJICAgICAqIDIuIFRoZSBiYWR3b3JkIGRvZXMgZW5kLCBidXQgaXQgd2FzIGR1ZSB0byBhIGNoYW5nZQotCQkgICAgICogICAgKGUuZy4sIGEgc3dhcCkuICBObyBuZWVkIHRvIHNwbGl0LCBidXQgZG8gY2hlY2sgdGhhdAotCQkgICAgICogICAgdGhlIGZvbGxvd2luZyB3b3JkIGlzIHZhbGlkLgotCQkgICAgICovCi0JCSAgICB0cnlfY29tcG91bmQgPSBGQUxTRTsKLQkJICAgIGlmICgoIWZ3b3JkX2VuZHMgfHwgIWdvb2R3b3JkX2VuZHMpCi0JCQkgICAgJiYgc2xhbmctPnNsX2NvbXBwcm9nICE9IE5VTEwKLQkJCSAgICAmJiAoKHVuc2lnbmVkKWZsYWdzID4+IDI0KSAhPSAwCi0JCQkgICAgJiYgc3AtPnRzX3R3b3JkbGVuIC0gc3AtPnRzX3NwbGl0b2ZmCi0JCQkJCQkgICAgICA+PSBzbGFuZy0+c2xfY29tcG1pbmxlbgorCQkvKiBJZiBwYXN0IHRoZSBlbmQgb2YgdGhlIGJhZCB3b3JkIGRvbid0IHRyeSBhIHNwbGl0LgorCQkgKiBPdGhlcndpc2UgdHJ5IGNoYW5naW5nIHRoZSBuZXh0IHdvcmQuICBFLmcuLCBmaW5kCisJCSAqIHN1Z2dlc3Rpb25zIGZvciAidGhlIHRoZSIgd2hlcmUgdGhlIHNlY29uZCAidGhlIiBpcworCQkgKiBkaWZmZXJlbnQuICBJdCdzIGRvbmUgbGlrZSBhIHNwbGl0LgorCQkgKiBUT0RPOiB3b3JkIHNwbGl0IGZvciBzb3VuZGZvbGQgd29yZHMgKi8KKwkJdHJ5X3NwbGl0ID0gKHNwLT50c19maWR4IC0gcmVwZXh0cmEgPCBzdS0+c3VfYmFkbGVuKQorCQkJCQkJCQkmJiAhc291bmRmb2xkOworCisJCS8qIEdldCBoZXJlIGluIHNldmVyYWwgc2l0dWF0aW9uczoKKwkJICogMS4gVGhlIHdvcmQgaW4gdGhlIHRyZWUgZW5kczoKKwkJICogICAgSWYgdGhlIHdvcmQgYWxsb3dzIGNvbXBvdW5kaW5nIHRyeSB0aGF0LiAgT3RoZXJ3aXNlIHRyeQorCQkgKiAgICBhIHNwbGl0IGJ5IGluc2VydGluZyBhIHNwYWNlLiAgRm9yIGJvdGggY2hlY2sgdGhhdCBhCisJCSAqICAgIHZhbGlkIHdvcmRzIHN0YXJ0cyBhdCBmd29yZFtzcC0+dHNfZmlkeF0uCisJCSAqICAgIEZvciBOT0JSRUFLIGRvIGxpa2UgY29tcG91bmRpbmcgdG8gYmUgYWJsZSB0byBjaGVjayBpZgorCQkgKiAgICB0aGUgbmV4dCB3b3JkIGlzIHZhbGlkLgorCQkgKiAyLiBUaGUgYmFkd29yZCBkb2VzIGVuZCwgYnV0IGl0IHdhcyBkdWUgdG8gYSBjaGFuZ2UgKGUuZy4sCisJCSAqICAgIGEgc3dhcCkuICBObyBuZWVkIHRvIHNwbGl0LCBidXQgZG8gY2hlY2sgdGhhdCB0aGUKKwkJICogICAgZm9sbG93aW5nIHdvcmQgaXMgdmFsaWQuCisJCSAqIDMuIFRoZSBiYWR3b3JkIGFuZCB0aGUgd29yZCBpbiB0aGUgdHJlZSBlbmQuICBJdCBtYXkgc3RpbGwKKwkJICogICAgYmUgcG9zc2libGUgdG8gY29tcG91bmQgYW5vdGhlciAoc2hvcnQpIHdvcmQuCisJCSAqLworCQl0cnlfY29tcG91bmQgPSBGQUxTRTsKKwkJaWYgKCFzb3VuZGZvbGQKKwkJCSYmIHNsYW5nLT5zbF9jb21wcHJvZyAhPSBOVUxMCisJCQkmJiAoKHVuc2lnbmVkKWZsYWdzID4+IDI0KSAhPSAwCisJCQkmJiBzcC0+dHNfdHdvcmRsZW4gLSBzcC0+dHNfc3BsaXRvZmYKKwkJCQkJCSAgICAgICA+PSBzbGFuZy0+c2xfY29tcG1pbmxlbgogI2lmZGVmIEZFQVRfTUJZVEUKLQkJCSAgICAmJiAoIWhhc19tYnl0ZQotCQkJCXx8IHNsYW5nLT5zbF9jb21wbWlubGVuID09IDAKLQkJCQl8fCBtYl9jaGFybGVuKHR3b3JkICsgc3AtPnRzX3NwbGl0b2ZmKQorCQkJJiYgKCFoYXNfbWJ5dGUKKwkJCSAgICB8fCBzbGFuZy0+c2xfY29tcG1pbmxlbiA9PSAwCisJCQkgICAgfHwgbWJfY2hhcmxlbih0d29yZCArIHNwLT50c19zcGxpdG9mZikKIAkJCQkJCSAgICAgID49IHNsYW5nLT5zbF9jb21wbWlubGVuKQogI2VuZGlmCi0JCQkgICAgJiYgKHNsYW5nLT5zbF9jb21wc3lsbWF4IDwgTUFYV0xFTgotCQkJCXx8IHNwLT50c19jb21wbGVuICsgMSAtIHNwLT50c19jb21wc3BsaXQKLQkJCQkJCQkgICA8IHNsYW5nLT5zbF9jb21wbWF4KQotCQkJICAgICYmIChieXRlX2luX3N0cihzcC0+dHNfY29tcGxlbiA9PSBzcC0+dHNfY29tcHNwbGl0Ci0JCQkJCQk/IHNsYW5nLT5zbF9jb21wc3RhcnRmbGFncwotCQkJCQkJOiBzbGFuZy0+c2xfY29tcGFsbGZsYWdzLAorCQkJJiYgKHNsYW5nLT5zbF9jb21wc3lsbWF4IDwgTUFYV0xFTgorCQkJICAgIHx8IHNwLT50c19jb21wbGVuICsgMSAtIHNwLT50c19jb21wc3BsaXQKKwkJCQkJCQkgIDwgc2xhbmctPnNsX2NvbXBtYXgpCisJCQkmJiAoYnl0ZV9pbl9zdHIoc3AtPnRzX2NvbXBsZW4gPT0gc3AtPnRzX2NvbXBzcGxpdAorCQkJCQkgICAgPyBzbGFuZy0+c2xfY29tcHN0YXJ0ZmxhZ3MKKwkJCQkJICAgIDogc2xhbmctPnNsX2NvbXBhbGxmbGFncywKIAkJCQkJCSAgICAoKHVuc2lnbmVkKWZsYWdzID4+IDI0KSkpKQotCQkgICAgewotCQkJdHJ5X2NvbXBvdW5kID0gVFJVRTsKLQkJCWNvbXBmbGFnc1tzcC0+dHNfY29tcGxlbl0gPSAoKHVuc2lnbmVkKWZsYWdzID4+IDI0KTsKLQkJCWNvbXBmbGFnc1tzcC0+dHNfY29tcGxlbiArIDFdID0gTlVMOwotCQkgICAgfQorCQl7CisJCSAgICB0cnlfY29tcG91bmQgPSBUUlVFOworCQkgICAgY29tcGZsYWdzW3NwLT50c19jb21wbGVuXSA9ICgodW5zaWduZWQpZmxhZ3MgPj4gMjQpOworCQkgICAgY29tcGZsYWdzW3NwLT50c19jb21wbGVuICsgMV0gPSBOVUw7CisJCX0KIAotCQkgICAgLyogRm9yIE5PQlJFQUsgd2UgbmV2ZXIgdHJ5IHNwbGl0dGluZywgaXQgd29uJ3QgbWFrZSBhbnkKLQkJICAgICAqIHdvcmQgdmFsaWQuICovCi0JCSAgICBpZiAoc2xhbmctPnNsX25vYnJlYWspCi0JCQl0cnlfY29tcG91bmQgPSBUUlVFOworCQkvKiBGb3IgTk9CUkVBSyB3ZSBuZXZlciB0cnkgc3BsaXR0aW5nLCBpdCB3b24ndCBtYWtlIGFueSB3b3JkCisJCSAqIHZhbGlkLiAqLworCQlpZiAoc2xhbmctPnNsX25vYnJlYWspCisJCSAgICB0cnlfY29tcG91bmQgPSBUUlVFOwogCi0JCSAgICAvKiBJZiB3ZSBjb3VsZCBhZGQgYSBjb21wb3VuZCB3b3JkLCBhbmQgaXQncyBhbHNvIHBvc3NpYmxlCi0JCSAgICAgKiB0byBzcGxpdCBhdCB0aGlzIHBvaW50LCBkbyB0aGUgc3BsaXQgZmlyc3QgYW5kIHNldAotCQkgICAgICogVFNGX0RJRFNQTElUIHRvIGF2b2lkIGRvaW5nIGl0IGFnYWluLiAqLwotCQkgICAgZWxzZSBpZiAoIWZ3b3JkX2VuZHMKLQkJCSAgICAmJiB0cnlfY29tcG91bmQKLQkJCSAgICAmJiAoc3AtPnRzX2ZsYWdzICYgVFNGX0RJRFNQTElUKSA9PSAwKQotCQkgICAgewotCQkJdHJ5X2NvbXBvdW5kID0gRkFMU0U7Ci0JCQlzcC0+dHNfZmxhZ3MgfD0gVFNGX0RJRFNQTElUOwotCQkJLS1zcC0+dHNfY3VyaTsJICAgIC8qIGRvIHRoZSBzYW1lIE5VTCBhZ2FpbiAqLwotCQkJY29tcGZsYWdzW3NwLT50c19jb21wbGVuXSA9IE5VTDsKLQkJICAgIH0KLQkJICAgIGVsc2UKLQkJCXNwLT50c19mbGFncyAmPSB+VFNGX0RJRFNQTElUOworCQkvKiBJZiB3ZSBjb3VsZCBhZGQgYSBjb21wb3VuZCB3b3JkLCBhbmQgaXQncyBhbHNvIHBvc3NpYmxlIHRvCisJCSAqIHNwbGl0IGF0IHRoaXMgcG9pbnQsIGRvIHRoZSBzcGxpdCBmaXJzdCBhbmQgc2V0CisJCSAqIFRTRl9ESURTUExJVCB0byBhdm9pZCBkb2luZyBpdCBhZ2Fpbi4gKi8KKwkJZWxzZSBpZiAoIWZ3b3JkX2VuZHMKKwkJCSYmIHRyeV9jb21wb3VuZAorCQkJJiYgKHNwLT50c19mbGFncyAmIFRTRl9ESURTUExJVCkgPT0gMCkKKwkJeworCQkgICAgdHJ5X2NvbXBvdW5kID0gRkFMU0U7CisJCSAgICBzcC0+dHNfZmxhZ3MgfD0gVFNGX0RJRFNQTElUOworCQkgICAgLS1zcC0+dHNfY3VyaTsJICAgIC8qIGRvIHRoZSBzYW1lIE5VTCBhZ2FpbiAqLworCQkgICAgY29tcGZsYWdzW3NwLT50c19jb21wbGVuXSA9IE5VTDsKKwkJfQorCQllbHNlCisJCSAgICBzcC0+dHNfZmxhZ3MgJj0gflRTRl9ESURTUExJVDsKIAorCQlpZiAodHJ5X3NwbGl0IHx8IHRyeV9jb21wb3VuZCkKKwkJewogCQkgICAgaWYgKCF0cnlfY29tcG91bmQgJiYgKCFmd29yZF9lbmRzIHx8ICFnb29kd29yZF9lbmRzKSkKIAkJICAgIHsKIAkJCS8qIElmIHdlJ3JlIGdvaW5nIHRvIHNwbGl0IG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUKQEAgLTk3MDcsMTAgKzEwOTk0LDIzIEBACiAJCQkJCQljb21wZmxhZ3MgKyBzcC0+dHNfY29tcHNwbGl0KSkKIAkJCSAgICBicmVhazsKIAkJCW5ld3Njb3JlICs9IFNDT1JFX1NQTElUOworCisJCQkvKiBHaXZlIGEgYm9udXMgdG8gd29yZHMgc2VlbiBiZWZvcmUuICovCisJCQluZXdzY29yZSA9IHNjb3JlX3dvcmRjb3VudF9hZGooc2xhbmcsIG5ld3Njb3JlLAorCQkJCQkgICBwcmV3b3JkICsgc3AtPnRzX3ByZXdvcmRsZW4sIFRSVUUpOwogCQkgICAgfQogCi0JCSAgICBpZiAodHJ5X2RlZXBlcihzdSwgc3RhY2ssIGRlcHRoLCBuZXdzY29yZSkpCisJCSAgICBpZiAoVFJZX0RFRVBFUihzdSwgc3RhY2ssIGRlcHRoLCBuZXdzY29yZSkpCiAJCSAgICB7CisJCQlnb19kZWVwZXIoc3RhY2ssIGRlcHRoLCBuZXdzY29yZSk7CisjaWZkZWYgREVCVUdfVFJJRVdBTEsKKwkJCWlmICghdHJ5X2NvbXBvdW5kICYmICFmd29yZF9lbmRzKQorCQkJICAgIHNwcmludGYoY2hhbmdlbmFtZVtkZXB0aF0sICIlLipzLSVzOiBzcGxpdCIsCisJCQkJIHNwLT50c190d29yZGxlbiwgdHdvcmQsIGZ3b3JkICsgc3AtPnRzX2ZpZHgpOworCQkJZWxzZQorCQkJICAgIHNwcmludGYoY2hhbmdlbmFtZVtkZXB0aF0sICIlLipzLSVzOiBjb21wb3VuZCIsCisJCQkJIHNwLT50c190d29yZGxlbiwgdHdvcmQsIGZ3b3JkICsgc3AtPnRzX2ZpZHgpOworI2VuZGlmCiAJCQkvKiBTYXZlIHRoaW5ncyB0byBiZSByZXN0b3JlZCBhdCBTVEFURV9TUExJVFVORE8uICovCiAJCQlzcC0+dHNfc2F2ZV9iYWRmbGFncyA9IHN1LT5zdV9iYWRmbGFnczsKIAkJCXNwLT50c19zdGF0ZSA9IFNUQVRFX1NQTElUVU5ETzsKQEAgLTk3MzAsMTAgKzExMDMwLDExIEBACiAJCQkgKiBub24td29yZCBjaGFyYWN0ZXIgd2l0aCBhIHNwYWNlLiAgQWx3YXlzIHNraXAgYQogCQkJICogY2hhcmFjdGVyIHdoZW4gdGhlIHdvcmQgZW5kcy4gIEJ1dCBvbmx5IHdoZW4gdGhlCiAJCQkgKiBnb29kIHdvcmQgY2FuIGVuZC4gKi8KLQkJCWlmICgoKCF0cnlfY29tcG91bmQKLQkJCQkgICAgJiYgIXNwZWxsX2lzd29yZHBfbm13KGZ3b3JkICsgc3AtPnRzX2ZpZHgpKQotCQkJCXx8IGZ3b3JkX2VuZHMpCi0JCQkgICAgJiYgZ29vZHdvcmRfZW5kcykKKwkJCWlmICgoKCF0cnlfY29tcG91bmQgJiYgIXNwZWxsX2lzd29yZHBfbm13KGZ3b3JkCisJCQkJCQkJICAgICAgICsgc3AtPnRzX2ZpZHgpKQorCQkJCSAgICB8fCBmd29yZF9lbmRzKQorCQkJCSYmIGZ3b3JkW3NwLT50c19maWR4XSAhPSBOVUwKKwkJCQkmJiBnb29kd29yZF9lbmRzKQogCQkJewogCQkJICAgIGludAkgICAgbDsKIApAQCAtOTc4OSwzNzAgKzExMDkwLDU3MiBAQAogCQkJfQogCQkgICAgfQogCQl9Ci0JCWJyZWFrOworCSAgICB9CisJICAgIGJyZWFrOwogCi0JICAgIGNhc2UgU1RBVEVfU1BMSVRVTkRPOgotCQkvKiBVbmRvIHRoZSBjaGFuZ2VzIGRvbmUgZm9yIHdvcmQgc3BsaXQgb3IgY29tcG91bmQgd29yZC4gKi8KLQkJc3UtPnN1X2JhZGZsYWdzID0gc3AtPnRzX3NhdmVfYmFkZmxhZ3M7CisJY2FzZSBTVEFURV9TUExJVFVORE86CisJICAgIC8qIFVuZG8gdGhlIGNoYW5nZXMgZG9uZSBmb3Igd29yZCBzcGxpdCBvciBjb21wb3VuZCB3b3JkLiAqLworCSAgICBzdS0+c3VfYmFkZmxhZ3MgPSBzcC0+dHNfc2F2ZV9iYWRmbGFnczsKIAotCQkvKiBDb250aW51ZSBsb29raW5nIGZvciBOVUwgYnl0ZXMuICovCi0JCXNwLT50c19zdGF0ZSA9IFNUQVRFX1NUQVJUOworCSAgICAvKiBDb250aW51ZSBsb29raW5nIGZvciBOVUwgYnl0ZXMuICovCisJICAgIHNwLT50c19zdGF0ZSA9IFNUQVRFX1NUQVJUOwogCi0JCS8qIEluIGNhc2Ugd2Ugd2VudCBpbnRvIHRoZSBwcmVmaXggdHJlZS4gKi8KLQkJYnl0cyA9IGZieXRzOwotCQlpZHhzID0gZmlkeHM7Ci0JCWJyZWFrOworCSAgICAvKiBJbiBjYXNlIHdlIHdlbnQgaW50byB0aGUgcHJlZml4IHRyZWUuICovCisJICAgIGJ5dHMgPSBmYnl0czsKKwkgICAgaWR4cyA9IGZpZHhzOworCSAgICBicmVhazsKIAotCSAgICBjYXNlIFNUQVRFX0VORE5VTDoKLQkJLyogUGFzdCB0aGUgTlVMIGJ5dGVzIGluIHRoZSBub2RlLiAqLwotCQlzdS0+c3VfYmFkZmxhZ3MgPSBzcC0+dHNfc2F2ZV9iYWRmbGFnczsKLQkJaWYgKGZ3b3JkW3NwLT50c19maWR4XSA9PSBOVUwKKwljYXNlIFNUQVRFX0VORE5VTDoKKwkgICAgLyogUGFzdCB0aGUgTlVMIGJ5dGVzIGluIHRoZSBub2RlLiAqLworCSAgICBzdS0+c3VfYmFkZmxhZ3MgPSBzcC0+dHNfc2F2ZV9iYWRmbGFnczsKKwkgICAgaWYgKGZ3b3JkW3NwLT50c19maWR4XSA9PSBOVUwKICNpZmRlZiBGRUFUX01CWVRFCi0JCQkmJiBzcC0+dHNfdGNoYXJsZW4gPT0gMAorCQkgICAgJiYgc3AtPnRzX3RjaGFybGVuID09IDAKICNlbmRpZgotCQkgICApCi0JCXsKLQkJICAgIC8qIFRoZSBiYWR3b3JkIGVuZHMsIGNhbid0IHVzZSB0aGUgYnl0ZXMgaW4gdGhpcyBub2RlLiAqLworCSAgICAgICApCisJICAgIHsKKwkJLyogVGhlIGJhZHdvcmQgZW5kcywgY2FuJ3QgdXNlIFNUQVRFX1BMQUlOLiAqLworCQlzcC0+dHNfc3RhdGUgPSBTVEFURV9ERUw7CisJCWJyZWFrOworCSAgICB9CisJICAgIHNwLT50c19zdGF0ZSA9IFNUQVRFX1BMQUlOOworCSAgICAvKkZBTExUSFJPVUdIKi8KKworCWNhc2UgU1RBVEVfUExBSU46CisJICAgIC8qCisJICAgICAqIEdvIG92ZXIgYWxsIHBvc3NpYmxlIGJ5dGVzIGF0IHRoaXMgbm9kZSwgYWRkIGVhY2ggdG8gdHdvcmRbXQorCSAgICAgKiBhbmQgdXNlIGNoaWxkIG5vZGUuICAidHNfY3VyaSIgaXMgdGhlIGluZGV4LgorCSAgICAgKi8KKwkgICAgYXJyaWR4ID0gc3AtPnRzX2FycmlkeDsKKwkgICAgaWYgKHNwLT50c19jdXJpID4gYnl0c1thcnJpZHhdKQorCSAgICB7CisJCS8qIERvbmUgYWxsIGJ5dGVzIGF0IHRoaXMgbm9kZSwgZG8gbmV4dCBzdGF0ZS4gIFdoZW4gc3RpbGwgYXQKKwkJICogYWxyZWFkeSBjaGFuZ2VkIGJ5dGVzIHNraXAgdGhlIG90aGVyIHRyaWNrcy4gKi8KKwkJaWYgKHNwLT50c19maWR4ID49IHNwLT50c19maWR4dHJ5KQogCQkgICAgc3AtPnRzX3N0YXRlID0gU1RBVEVfREVMOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkJc3AtPnRzX3N0YXRlID0gU1RBVEVfUExBSU47Ci0JCS8qRkFMTFRIUk9VR0gqLwotCi0JICAgIGNhc2UgU1RBVEVfUExBSU46Ci0JCS8qCi0JCSAqIEdvIG92ZXIgYWxsIHBvc3NpYmxlIGJ5dGVzIGF0IHRoaXMgbm9kZSwgYWRkIGVhY2ggdG8KLQkJICogdHdvcmRbXSBhbmQgdXNlIGNoaWxkIG5vZGUuICAidHNfY3VyaSIgaXMgdGhlIGluZGV4LgotCQkgKi8KLQkJYXJyaWR4ID0gc3AtPnRzX2FycmlkeDsKLQkJaWYgKHNwLT50c19jdXJpID4gYnl0c1thcnJpZHhdKQotCQl7Ci0JCSAgICAvKiBEb25lIGFsbCBieXRlcyBhdCB0aGlzIG5vZGUsIGRvIG5leHQgc3RhdGUuICBXaGVuIHN0aWxsCi0JCSAgICAgKiBhdCBhbHJlYWR5IGNoYW5nZWQgYnl0ZXMgc2tpcCB0aGUgb3RoZXIgdHJpY2tzLiAqLwotCQkgICAgaWYgKHNwLT50c19maWR4ID49IHNwLT50c19maWR4dHJ5KQotCQkJc3AtPnRzX3N0YXRlID0gU1RBVEVfREVMOwotCQkgICAgZWxzZQotCQkJc3AtPnRzX3N0YXRlID0gU1RBVEVfRklOQUw7Ci0JCX0KIAkJZWxzZQotCQl7Ci0JCSAgICBhcnJpZHggKz0gc3AtPnRzX2N1cmkrKzsKLQkJICAgIGMgPSBieXRzW2FycmlkeF07CisJCSAgICBzcC0+dHNfc3RhdGUgPSBTVEFURV9GSU5BTDsKKwkgICAgfQorCSAgICBlbHNlCisJICAgIHsKKwkJYXJyaWR4ICs9IHNwLT50c19jdXJpKys7CisJCWMgPSBieXRzW2FycmlkeF07CiAKLQkJICAgIC8qIE5vcm1hbCBieXRlLCBnbyBvbmUgbGV2ZWwgZGVlcGVyLiAgSWYgaXQncyBub3QgZXF1YWwgdG8KLQkJICAgICAqIHRoZSBieXRlIGluIHRoZSBiYWQgd29yZCBhZGp1c3QgdGhlIHNjb3JlLiAgQnV0IGRvbid0Ci0JCSAgICAgKiBldmVuIHRyeSB3aGVuIHRoZSBieXRlIHdhcyBhbHJlYWR5IGNoYW5nZWQuICovCi0JCSAgICBpZiAoYyA9PSBmd29yZFtzcC0+dHNfZmlkeF0KKwkJLyogTm9ybWFsIGJ5dGUsIGdvIG9uZSBsZXZlbCBkZWVwZXIuICBJZiBpdCdzIG5vdCBlcXVhbCB0byB0aGUKKwkJICogYnl0ZSBpbiB0aGUgYmFkIHdvcmQgYWRqdXN0IHRoZSBzY29yZS4gIEJ1dCBkb24ndCBldmVuIHRyeQorCQkgKiB3aGVuIHRoZSBieXRlIHdhcyBhbHJlYWR5IGNoYW5nZWQuICBBbmQgZG9uJ3QgdHJ5IHdoZW4gd2UKKwkJICoganVzdCBkZWxldGVkIHRoaXMgYnl0ZSwgYWNjZXB0aW5nIGl0IGlzIGFsd2F5cyBjaGVhcGVyIHRoZW4KKwkJICogZGVsZXRlICsgc3Vic3RpdHV0ZS4gKi8KKwkJaWYgKGMgPT0gZndvcmRbc3AtPnRzX2ZpZHhdCiAjaWZkZWYgRkVBVF9NQllURQotCQkJICAgIHx8IChzcC0+dHNfdGNoYXJsZW4gPiAwCi0JCQkJCQkmJiBzcC0+dHNfaXNkaWZmICE9IERJRkZfTk9ORSkKKwkJCXx8IChzcC0+dHNfdGNoYXJsZW4gPiAwICYmIHNwLT50c19pc2RpZmYgIT0gRElGRl9OT05FKQogI2VuZGlmCi0JCQkgICAgKQotCQkJbmV3c2NvcmUgPSAwOworCQkJKQorCQkgICAgbmV3c2NvcmUgPSAwOworCQllbHNlCisJCSAgICBuZXdzY29yZSA9IFNDT1JFX1NVQlNUOworCQlpZiAoKG5ld3Njb3JlID09IDAKKwkJCSAgICB8fCAoc3AtPnRzX2ZpZHggPj0gc3AtPnRzX2ZpZHh0cnkKKwkJCQkmJiAoKHNwLT50c19mbGFncyAmIFRTRl9ESURERUwpID09IDAKKwkJCQkgICAgfHwgYyAhPSBmd29yZFtzcC0+dHNfZGVsaWR4XSkpKQorCQkJJiYgVFJZX0RFRVBFUihzdSwgc3RhY2ssIGRlcHRoLCBuZXdzY29yZSkpCisJCXsKKwkJICAgIGdvX2RlZXBlcihzdGFjaywgZGVwdGgsIG5ld3Njb3JlKTsKKyNpZmRlZiBERUJVR19UUklFV0FMSworCQkgICAgaWYgKG5ld3Njb3JlID4gMCkKKwkJCXNwcmludGYoY2hhbmdlbmFtZVtkZXB0aF0sICIlLipzLSVzOiBzdWJzdCAlYyB0byAlYyIsCisJCQkJc3AtPnRzX3R3b3JkbGVuLCB0d29yZCwgZndvcmQgKyBzcC0+dHNfZmlkeCwKKwkJCQlmd29yZFtzcC0+dHNfZmlkeF0sIGMpOwogCQkgICAgZWxzZQotCQkJbmV3c2NvcmUgPSBTQ09SRV9TVUJTVDsKLQkJICAgIGlmICgobmV3c2NvcmUgPT0gMCB8fCBzcC0+dHNfZmlkeCA+PSBzcC0+dHNfZmlkeHRyeSkKLQkJCQkgICAgJiYgdHJ5X2RlZXBlcihzdSwgc3RhY2ssIGRlcHRoLCBuZXdzY29yZSkpCi0JCSAgICB7Ci0JCQkrK2RlcHRoOwotCQkJc3AgPSAmc3RhY2tbZGVwdGhdOwotCQkJKytzcC0+dHNfZmlkeDsKLQkJCXR3b3JkW3NwLT50c190d29yZGxlbisrXSA9IGM7Ci0JCQlzcC0+dHNfYXJyaWR4ID0gaWR4c1thcnJpZHhdOworCQkJc3ByaW50ZihjaGFuZ2VuYW1lW2RlcHRoXSwgIiUuKnMtJXM6IGFjY2VwdCAlYyIsCisJCQkJc3AtPnRzX3R3b3JkbGVuLCB0d29yZCwgZndvcmQgKyBzcC0+dHNfZmlkeCwKKwkJCQlmd29yZFtzcC0+dHNfZmlkeF0pOworI2VuZGlmCisJCSAgICArK2RlcHRoOworCQkgICAgc3AgPSAmc3RhY2tbZGVwdGhdOworCQkgICAgKytzcC0+dHNfZmlkeDsKKwkJICAgIHR3b3JkW3NwLT50c190d29yZGxlbisrXSA9IGM7CisJCSAgICBzcC0+dHNfYXJyaWR4ID0gaWR4c1thcnJpZHhdOwogI2lmZGVmIEZFQVRfTUJZVEUKLQkJCWlmIChuZXdzY29yZSA9PSBTQ09SRV9TVUJTVCkKLQkJCSAgICBzcC0+dHNfaXNkaWZmID0gRElGRl9ZRVM7Ci0JCQlpZiAoaGFzX21ieXRlKQorCQkgICAgaWYgKG5ld3Njb3JlID09IFNDT1JFX1NVQlNUKQorCQkJc3AtPnRzX2lzZGlmZiA9IERJRkZfWUVTOworCQkgICAgaWYgKGhhc19tYnl0ZSkKKwkJICAgIHsKKwkJCS8qIE11bHRpLWJ5dGUgY2hhcmFjdGVycyBhcmUgYSBiaXQgY29tcGxpY2F0ZWQgdG8KKwkJCSAqIGhhbmRsZTogVGhleSBkaWZmZXIgd2hlbiBhbnkgb2YgdGhlIGJ5dGVzIGRpZmZlcgorCQkJICogYW5kIHRoZW4gdGhlaXIgbGVuZ3RoIG1heSBhbHNvIGRpZmZlci4gKi8KKwkJCWlmIChzcC0+dHNfdGNoYXJsZW4gPT0gMCkKIAkJCXsKLQkJCSAgICAvKiBNdWx0aS1ieXRlIGNoYXJhY3RlcnMgYXJlIGEgYml0IGNvbXBsaWNhdGVkIHRvCi0JCQkgICAgICogaGFuZGxlOiBUaGV5IGRpZmZlciB3aGVuIGFueSBvZiB0aGUgYnl0ZXMKLQkJCSAgICAgKiBkaWZmZXIgYW5kIHRoZW4gdGhlaXIgbGVuZ3RoIG1heSBhbHNvIGRpZmZlci4gKi8KLQkJCSAgICBpZiAoc3AtPnRzX3RjaGFybGVuID09IDApCi0JCQkgICAgewotCQkJCS8qIEZpcnN0IGJ5dGUuICovCi0JCQkJc3AtPnRzX3RjaGFyaWR4ID0gMDsKLQkJCQlzcC0+dHNfdGNoYXJsZW4gPSBNQl9CWVRFMkxFTihjKTsKLQkJCQlzcC0+dHNfZmNoYXJzdGFydCA9IHNwLT50c19maWR4IC0gMTsKLQkJCQlzcC0+dHNfaXNkaWZmID0gKG5ld3Njb3JlICE9IDApCisJCQkgICAgLyogRmlyc3QgYnl0ZS4gKi8KKwkJCSAgICBzcC0+dHNfdGNoYXJpZHggPSAwOworCQkJICAgIHNwLT50c190Y2hhcmxlbiA9IE1CX0JZVEUyTEVOKGMpOworCQkJICAgIHNwLT50c19mY2hhcnN0YXJ0ID0gc3AtPnRzX2ZpZHggLSAxOworCQkJICAgIHNwLT50c19pc2RpZmYgPSAobmV3c2NvcmUgIT0gMCkKIAkJCQkJCSAgICAgICA/IERJRkZfWUVTIDogRElGRl9OT05FOwotCQkJICAgIH0KLQkJCSAgICBlbHNlIGlmIChzcC0+dHNfaXNkaWZmID09IERJRkZfSU5TRVJUKQotCQkJCS8qIFdoZW4gaW5zZXJ0aW5nIHRyYWlsIGJ5dGVzIGRvbid0IGFkdmFuY2UgaW4KLQkJCQkgKiB0aGUgYmFkIHdvcmQuICovCi0JCQkJLS1zcC0+dHNfZmlkeDsKLQkJCSAgICBpZiAoKytzcC0+dHNfdGNoYXJpZHggPT0gc3AtPnRzX3RjaGFybGVuKQorCQkJfQorCQkJZWxzZSBpZiAoc3AtPnRzX2lzZGlmZiA9PSBESUZGX0lOU0VSVCkKKwkJCSAgICAvKiBXaGVuIGluc2VydGluZyB0cmFpbCBieXRlcyBkb24ndCBhZHZhbmNlIGluIHRoZQorCQkJICAgICAqIGJhZCB3b3JkLiAqLworCQkJICAgIC0tc3AtPnRzX2ZpZHg7CisJCQlpZiAoKytzcC0+dHNfdGNoYXJpZHggPT0gc3AtPnRzX3RjaGFybGVuKQorCQkJeworCQkJICAgIC8qIExhc3QgYnl0ZSBvZiBjaGFyYWN0ZXIuICovCisJCQkgICAgaWYgKHNwLT50c19pc2RpZmYgPT0gRElGRl9ZRVMpCiAJCQkgICAgewotCQkJCS8qIExhc3QgYnl0ZSBvZiBjaGFyYWN0ZXIuICovCi0JCQkJaWYgKHNwLT50c19pc2RpZmYgPT0gRElGRl9ZRVMpCi0JCQkJewotCQkJCSAgICAvKiBDb3JyZWN0IHRzX2ZpZHggZm9yIHRoZSBieXRlIGxlbmd0aCBvZgotCQkJCSAgICAgKiB0aGUgY2hhcmFjdGVyICh3ZSBkaWRuJ3QgY2hlY2sgdGhhdAotCQkJCSAgICAgKiBiZWZvcmUpLiAqLwotCQkJCSAgICBzcC0+dHNfZmlkeCA9IHNwLT50c19mY2hhcnN0YXJ0Ci0JCQkJCQkrIE1CX0JZVEUyTEVOKAorCQkJCS8qIENvcnJlY3QgdHNfZmlkeCBmb3IgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZQorCQkJCSAqIGNoYXJhY3RlciAod2UgZGlkbid0IGNoZWNrIHRoYXQgYmVmb3JlKS4gKi8KKwkJCQlzcC0+dHNfZmlkeCA9IHNwLT50c19mY2hhcnN0YXJ0CisJCQkJCSAgICArIE1CX0JZVEUyTEVOKAogCQkJCQkJICAgIGZ3b3JkW3NwLT50c19mY2hhcnN0YXJ0XSk7CiAKLQkJCQkgICAgLyogRm9yIGNoYW5naW5nIGEgY29tcG9zaW5nIGNoYXJhY3RlcgotCQkJCSAgICAgKiBhZGp1c3QgdGhlIHNjb3JlIGZyb20gU0NPUkVfU1VCU1QgdG8KLQkJCQkgICAgICogU0NPUkVfU1VCQ09NUC4gKi8KLQkJCQkgICAgaWYgKGVuY191dGY4Ci0JCQkJCSAgICAmJiB1dGZfaXNjb21wb3NpbmcoCi0JCQkJCQltYl9wdHIyY2hhcih0d29yZAotCQkJCQkJICAgICsgc3AtPnRzX3R3b3JkbGVuCisJCQkJLyogRm9yIGNoYW5naW5nIGEgY29tcG9zaW5nIGNoYXJhY3RlciBhZGp1c3QKKwkJCQkgKiB0aGUgc2NvcmUgZnJvbSBTQ09SRV9TVUJTVCB0bworCQkJCSAqIFNDT1JFX1NVQkNPTVAuICovCisJCQkJaWYgKGVuY191dGY4CisJCQkJCSYmIHV0Zl9pc2NvbXBvc2luZygKKwkJCQkJICAgIG1iX3B0cjJjaGFyKHR3b3JkCisJCQkJCQkrIHNwLT50c190d29yZGxlbgogCQkJCQkJCSAgIC0gc3AtPnRzX3RjaGFybGVuKSkKLQkJCQkJICAgICYmIHV0Zl9pc2NvbXBvc2luZygKLQkJCQkJCW1iX3B0cjJjaGFyKGZ3b3JkCisJCQkJCSYmIHV0Zl9pc2NvbXBvc2luZygKKwkJCQkJICAgIG1iX3B0cjJjaGFyKGZ3b3JkCiAJCQkJCQkJKyBzcC0+dHNfZmNoYXJzdGFydCkpKQotCQkJCQlzcC0+dHNfc2NvcmUgLT0KKwkJCQkgICAgc3AtPnRzX3Njb3JlIC09CiAJCQkJCQkgIFNDT1JFX1NVQlNUIC0gU0NPUkVfU1VCQ09NUDsKIAotCQkJCSAgICAvKiBGb3IgYSBzaW1pbGFyIGNoYXJhY3RlciBhZGp1c3Qgc2NvcmUKLQkJCQkgICAgICogZnJvbSBTQ09SRV9TVUJTVCB0byBTQ09SRV9TSU1JTEFSLiAqLwotCQkJCSAgICBlbHNlIGlmIChzbGFuZy0+c2xfaGFzX21hcAotCQkJCQkgICAgJiYgc2ltaWxhcl9jaGFycyhzbGFuZywKLQkJCQkJCW1iX3B0cjJjaGFyKHR3b3JkCi0JCQkJCQkgICAgKyBzcC0+dHNfdHdvcmRsZW4KKwkJCQkvKiBGb3IgYSBzaW1pbGFyIGNoYXJhY3RlciBhZGp1c3Qgc2NvcmUgZnJvbQorCQkJCSAqIFNDT1JFX1NVQlNUIHRvIFNDT1JFX1NJTUlMQVIuICovCisJCQkJZWxzZSBpZiAoIXNvdW5kZm9sZAorCQkJCQkmJiBzbGFuZy0+c2xfaGFzX21hcAorCQkJCQkmJiBzaW1pbGFyX2NoYXJzKHNsYW5nLAorCQkJCQkgICAgbWJfcHRyMmNoYXIodHdvcmQKKwkJCQkJCSsgc3AtPnRzX3R3b3JkbGVuCiAJCQkJCQkJICAgLSBzcC0+dHNfdGNoYXJsZW4pLAotCQkJCQkJbWJfcHRyMmNoYXIoZndvcmQKKwkJCQkJICAgIG1iX3B0cjJjaGFyKGZ3b3JkCiAJCQkJCQkJKyBzcC0+dHNfZmNoYXJzdGFydCkpKQotCQkJCQlzcC0+dHNfc2NvcmUgLT0KKwkJCQkgICAgc3AtPnRzX3Njb3JlIC09CiAJCQkJCQkgIFNDT1JFX1NVQlNUIC0gU0NPUkVfU0lNSUxBUjsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoc3AtPnRzX2lzZGlmZiA9PSBESUZGX0lOU0VSVAotCQkJCQkmJiBzcC0+dHNfdHdvcmRsZW4gPiBzcC0+dHNfdGNoYXJsZW4pCi0JCQkJewotCQkJCSAgICBwID0gdHdvcmQgKyBzcC0+dHNfdHdvcmRsZW4KLQkJCQkJCQkgICAgLSBzcC0+dHNfdGNoYXJsZW47Ci0JCQkJICAgIGMgPSBtYl9wdHIyY2hhcihwKTsKLQkJCQkgICAgaWYgKGVuY191dGY4ICYmIHV0Zl9pc2NvbXBvc2luZyhjKSkKLQkJCQkgICAgewotCQkJCQkvKiBJbnNlcnRpbmcgYSBjb21wb3NpbmcgY2hhciBkb2Vzbid0Ci0JCQkJCSAqIGNvdW50IHRoYXQgbXVjaC4gKi8KLQkJCQkJc3AtPnRzX3Njb3JlIC09IFNDT1JFX0lOUwotCQkJCQkJCSAgICAgIC0gU0NPUkVfSU5TQ09NUDsKLQkJCQkgICAgfQotCQkJCSAgICBlbHNlCi0JCQkJICAgIHsKLQkJCQkJLyogSWYgdGhlIHByZXZpb3VzIGNoYXJhY3RlciB3YXMgdGhlCi0JCQkJCSAqIHNhbWUsIHRodXMgZG91YmxpbmcgYSBjaGFyYWN0ZXIsCi0JCQkJCSAqIGdpdmUgYSBib251cyB0byB0aGUgc2NvcmUuICovCi0JCQkJCW1iX3B0cl9iYWNrKHR3b3JkLCBwKTsKLQkJCQkJaWYgKGMgPT0gbWJfcHRyMmNoYXIocCkpCi0JCQkJCSAgICBzcC0+dHNfc2NvcmUgLT0gU0NPUkVfSU5TCi0JCQkJCQkJICAgICAgIC0gU0NPUkVfSU5TRFVQOwotCQkJCSAgICB9Ci0JCQkJfQotCi0JCQkJLyogU3RhcnRpbmcgYSBuZXcgY2hhciwgcmVzZXQgdGhlIGxlbmd0aC4gKi8KLQkJCQlzcC0+dHNfdGNoYXJsZW4gPSAwOwogCQkJICAgIH0KLQkJCX0KLQkJCWVsc2UKLSNlbmRpZgotCQkJewotCQkJICAgIC8qIElmIHdlIGZvdW5kIGEgc2ltaWxhciBjaGFyIGFkanVzdCB0aGUgc2NvcmUuCi0JCQkgICAgICogV2UgZG8gdGhpcyBhZnRlciBjYWxsaW5nIHRyeV9kZWVwZXIoKSBiZWNhdXNlCi0JCQkgICAgICogaXQncyBzbG93LiAqLwotCQkJICAgIGlmIChuZXdzY29yZSAhPSAwCi0JCQkJICAgICYmIHNsYW5nLT5zbF9oYXNfbWFwCi0JCQkJICAgICYmIHNpbWlsYXJfY2hhcnMoc2xhbmcsCi0JCQkJCQkgICBjLCBmd29yZFtzcC0+dHNfZmlkeCAtIDFdKSkKLQkJCQlzcC0+dHNfc2NvcmUgLT0gU0NPUkVfU1VCU1QgLSBTQ09SRV9TSU1JTEFSOwotCQkJfQotCQkgICAgfQotCQl9Ci0JCWJyZWFrOworCQkJICAgIGVsc2UgaWYgKHNwLT50c19pc2RpZmYgPT0gRElGRl9JTlNFUlQKKwkJCQkJICYmIHNwLT50c190d29yZGxlbiA+IHNwLT50c190Y2hhcmxlbikKKwkJCSAgICB7CisJCQkJcCA9IHR3b3JkICsgc3AtPnRzX3R3b3JkbGVuIC0gc3AtPnRzX3RjaGFybGVuOworCQkJCWMgPSBtYl9wdHIyY2hhcihwKTsKKwkJCQlpZiAoZW5jX3V0ZjggJiYgdXRmX2lzY29tcG9zaW5nKGMpKQorCQkJCXsKKwkJCQkgICAgLyogSW5zZXJ0aW5nIGEgY29tcG9zaW5nIGNoYXIgZG9lc24ndAorCQkJCSAgICAgKiBjb3VudCB0aGF0IG11Y2guICovCisJCQkJICAgIHNwLT50c19zY29yZSAtPSBTQ09SRV9JTlMgLSBTQ09SRV9JTlNDT01QOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCSAgICAvKiBJZiB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIHdhcyB0aGUgc2FtZSwKKwkJCQkgICAgICogdGh1cyBkb3VibGluZyBhIGNoYXJhY3RlciwgZ2l2ZSBhIGJvbnVzCisJCQkJICAgICAqIHRvIHRoZSBzY29yZS4gIEFsc28gZm9yIHRoZSBzb3VuZGZvbGQKKwkJCQkgICAgICogdHJlZSAobWlnaHQgc2VlbSBpbGxvZ2ljYWwgYnV0IGRvZXMKKwkJCQkgICAgICogZ2l2ZSBiZXR0ZXIgc2NvcmVzKS4gKi8KKwkJCQkgICAgbWJfcHRyX2JhY2sodHdvcmQsIHApOworCQkJCSAgICBpZiAoYyA9PSBtYl9wdHIyY2hhcihwKSkKKwkJCQkJc3AtPnRzX3Njb3JlIC09IFNDT1JFX0lOUworCQkJCQkJCSAgICAgICAtIFNDT1JFX0lOU0RVUDsKKwkJCQl9CisJCQkgICAgfQogCi0JICAgIGNhc2UgU1RBVEVfREVMOgotI2lmZGVmIEZFQVRfTUJZVEUKLQkJLyogV2hlbiBwYXN0IHRoZSBmaXJzdCBieXRlIG9mIGEgbXVsdGktYnl0ZSBjaGFyIGRvbid0IHRyeQotCQkgKiBkZWxldGUvaW5zZXJ0L3N3YXAgYSBjaGFyYWN0ZXIuICovCi0JCWlmIChoYXNfbWJ5dGUgJiYgc3AtPnRzX3RjaGFybGVuID4gMCkKLQkJewotCQkgICAgc3AtPnRzX3N0YXRlID0gU1RBVEVfRklOQUw7Ci0JCSAgICBicmVhazsKLQkJfQotI2VuZGlmCi0JCS8qCi0JCSAqIFRyeSBza2lwcGluZyBvbmUgY2hhcmFjdGVyIGluIHRoZSBiYWQgd29yZCAoZGVsZXRlIGl0KS4KLQkJICovCi0JCXNwLT50c19zdGF0ZSA9IFNUQVRFX0lOUzsKLQkJc3AtPnRzX2N1cmkgPSAxOwotCQlpZiAoZndvcmRbc3AtPnRzX2ZpZHhdICE9IE5VTAotCQkJJiYgdHJ5X2RlZXBlcihzdSwgc3RhY2ssIGRlcHRoLCBTQ09SRV9ERUwpKQotCQl7Ci0JCSAgICArK2RlcHRoOwotCi0JCSAgICAvKiBBZHZhbmNlIG92ZXIgdGhlIGNoYXJhY3RlciBpbiBmd29yZFtdLiBHaXZlIGEgYm9udXMgdG8KLQkJICAgICAqIHRoZSBzY29yZSBpZiB0aGUgc2FtZSBjaGFyYWN0ZXIgaXMgZm9sbG93aW5nICJubiIgLT4KLQkJICAgICAqICJuIi4gKi8KLSNpZmRlZiBGRUFUX01CWVRFCi0JCSAgICBpZiAoaGFzX21ieXRlKQotCQkgICAgewotCQkJYyA9IG1iX3B0cjJjaGFyKGZ3b3JkICsgc3AtPnRzX2ZpZHgpOwotCQkJc3RhY2tbZGVwdGhdLnRzX2ZpZHggKz0gTUJfQllURTJMRU4oZndvcmRbc3AtPnRzX2ZpZHhdKTsKLQkJCWlmIChlbmNfdXRmOCAmJiB1dGZfaXNjb21wb3NpbmcoYykpCi0JCQkgICAgc3RhY2tbZGVwdGhdLnRzX3Njb3JlIC09IFNDT1JFX0RFTCAtIFNDT1JFX0RFTENPTVA7Ci0JCQllbHNlIGlmIChjID09IG1iX3B0cjJjaGFyKGZ3b3JkICsgc3RhY2tbZGVwdGhdLnRzX2ZpZHgpKQotCQkJICAgIHN0YWNrW2RlcHRoXS50c19zY29yZSAtPSBTQ09SRV9ERUwgLSBTQ09SRV9ERUxEVVA7CisJCQkgICAgLyogU3RhcnRpbmcgYSBuZXcgY2hhciwgcmVzZXQgdGhlIGxlbmd0aC4gKi8KKwkJCSAgICBzcC0+dHNfdGNoYXJsZW4gPSAwOworCQkJfQogCQkgICAgfQogCQkgICAgZWxzZQogI2VuZGlmCiAJCSAgICB7Ci0JCQkrK3N0YWNrW2RlcHRoXS50c19maWR4OwotCQkJaWYgKGZ3b3JkW3NwLT50c19maWR4XSA9PSBmd29yZFtzcC0+dHNfZmlkeCArIDFdKQotCQkJICAgIHN0YWNrW2RlcHRoXS50c19zY29yZSAtPSBTQ09SRV9ERUwgLSBTQ09SRV9ERUxEVVA7CisJCQkvKiBJZiB3ZSBmb3VuZCBhIHNpbWlsYXIgY2hhciBhZGp1c3QgdGhlIHNjb3JlLgorCQkJICogV2UgZG8gdGhpcyBhZnRlciBjYWxsaW5nIGdvX2RlZXBlcigpIGJlY2F1c2UKKwkJCSAqIGl0J3Mgc2xvdy4gKi8KKwkJCWlmIChuZXdzY29yZSAhPSAwCisJCQkJJiYgIXNvdW5kZm9sZAorCQkJCSYmIHNsYW5nLT5zbF9oYXNfbWFwCisJCQkJJiYgc2ltaWxhcl9jaGFycyhzbGFuZywKKwkJCQkJCSAgIGMsIGZ3b3JkW3NwLT50c19maWR4IC0gMV0pKQorCQkJICAgIHNwLT50c19zY29yZSAtPSBTQ09SRV9TVUJTVCAtIFNDT1JFX1NJTUlMQVI7CiAJCSAgICB9Ci0JCSAgICBicmVhazsKIAkJfQotCQkvKkZBTExUSFJPVUdIKi8KKwkgICAgfQorCSAgICBicmVhazsKIAotCSAgICBjYXNlIFNUQVRFX0lOUzoKLQkJLyogSW5zZXJ0IG9uZSBieXRlLiAgRG8gdGhpcyBmb3IgZWFjaCBwb3NzaWJsZSBieXRlIGF0IHRoaXMKLQkJICogbm9kZS4gKi8KLQkJbiA9IHNwLT50c19hcnJpZHg7CisJY2FzZSBTVEFURV9ERUw6CisjaWZkZWYgRkVBVF9NQllURQorCSAgICAvKiBXaGVuIHBhc3QgdGhlIGZpcnN0IGJ5dGUgb2YgYSBtdWx0aS1ieXRlIGNoYXIgZG9uJ3QgdHJ5CisJICAgICAqIGRlbGV0ZS9pbnNlcnQvc3dhcCBhIGNoYXJhY3Rlci4gKi8KKwkgICAgaWYgKGhhc19tYnl0ZSAmJiBzcC0+dHNfdGNoYXJsZW4gPiAwKQorCSAgICB7CisJCXNwLT50c19zdGF0ZSA9IFNUQVRFX0ZJTkFMOworCQlicmVhazsKKwkgICAgfQorI2VuZGlmCisJICAgIC8qCisJICAgICAqIFRyeSBza2lwcGluZyBvbmUgY2hhcmFjdGVyIGluIHRoZSBiYWQgd29yZCAoZGVsZXRlIGl0KS4KKwkgICAgICovCisJICAgIHNwLT50c19zdGF0ZSA9IFNUQVRFX0lOU19QUkVQOworCSAgICBzcC0+dHNfY3VyaSA9IDE7CisJICAgIGlmIChzb3VuZGZvbGQgJiYgc3AtPnRzX2ZpZHggPT0gMCAmJiBmd29yZFtzcC0+dHNfZmlkeF0gPT0gJyonKQorCQkvKiBEZWxldGluZyBhIHZvd2VsIGF0IHRoZSBzdGFydCBvZiBhIHdvcmQgY291bnRzIGxlc3MsIHNlZQorCQkgKiBzb3VuZGFsaWtlX3Njb3JlKCkuICovCisJCW5ld3Njb3JlID0gMiAqIFNDT1JFX0RFTCAvIDM7CisJICAgIGVsc2UKKwkJbmV3c2NvcmUgPSBTQ09SRV9ERUw7CisJICAgIGlmIChmd29yZFtzcC0+dHNfZmlkeF0gIT0gTlVMCisJCQkJICAgICYmIFRSWV9ERUVQRVIoc3UsIHN0YWNrLCBkZXB0aCwgbmV3c2NvcmUpKQorCSAgICB7CisJCWdvX2RlZXBlcihzdGFjaywgZGVwdGgsIG5ld3Njb3JlKTsKKyNpZmRlZiBERUJVR19UUklFV0FMSworCQlzcHJpbnRmKGNoYW5nZW5hbWVbZGVwdGhdLCAiJS4qcy0lczogZGVsZXRlICVjIiwKKwkJCXNwLT50c190d29yZGxlbiwgdHdvcmQsIGZ3b3JkICsgc3AtPnRzX2ZpZHgsCisJCQlmd29yZFtzcC0+dHNfZmlkeF0pOworI2VuZGlmCisJCSsrZGVwdGg7CisKKwkJLyogUmVtZW1iZXIgd2hhdCBjaGFyYWN0ZXIgd2UgZGVsZXRlZCwgc28gdGhhdCB3ZSBjYW4gYXZvaWQKKwkJICogaW5zZXJ0aW5nIGl0IGFnYWluLiAqLworCQlzdGFja1tkZXB0aF0udHNfZmxhZ3MgfD0gVFNGX0RJRERFTDsKKwkJc3RhY2tbZGVwdGhdLnRzX2RlbGlkeCA9IHNwLT50c19maWR4OworCisJCS8qIEFkdmFuY2Ugb3ZlciB0aGUgY2hhcmFjdGVyIGluIGZ3b3JkW10uICBHaXZlIGEgYm9udXMgdG8gdGhlCisJCSAqIHNjb3JlIGlmIHRoZSBzYW1lIGNoYXJhY3RlciBpcyBmb2xsb3dpbmcgIm5uIiAtPiAibiIuICBJdCdzCisJCSAqIGEgYml0IGlsbG9naWNhbCBmb3Igc291bmRmb2xkIHRyZWUgYnV0IGl0IGRvZXMgZ2l2ZSBiZXR0ZXIKKwkJICogcmVzdWx0cy4gKi8KKyNpZmRlZiBGRUFUX01CWVRFCisJCWlmIChoYXNfbWJ5dGUpCisJCXsKKwkJICAgIGMgPSBtYl9wdHIyY2hhcihmd29yZCArIHNwLT50c19maWR4KTsKKwkJICAgIHN0YWNrW2RlcHRoXS50c19maWR4ICs9IE1CX0JZVEUyTEVOKGZ3b3JkW3NwLT50c19maWR4XSk7CisJCSAgICBpZiAoZW5jX3V0ZjggJiYgdXRmX2lzY29tcG9zaW5nKGMpKQorCQkJc3RhY2tbZGVwdGhdLnRzX3Njb3JlIC09IFNDT1JFX0RFTCAtIFNDT1JFX0RFTENPTVA7CisJCSAgICBlbHNlIGlmIChjID09IG1iX3B0cjJjaGFyKGZ3b3JkICsgc3RhY2tbZGVwdGhdLnRzX2ZpZHgpKQorCQkJc3RhY2tbZGVwdGhdLnRzX3Njb3JlIC09IFNDT1JFX0RFTCAtIFNDT1JFX0RFTERVUDsKKwkJfQorCQllbHNlCisjZW5kaWYKKwkJeworCQkgICAgKytzdGFja1tkZXB0aF0udHNfZmlkeDsKKwkJICAgIGlmIChmd29yZFtzcC0+dHNfZmlkeF0gPT0gZndvcmRbc3AtPnRzX2ZpZHggKyAxXSkKKwkJCXN0YWNrW2RlcHRoXS50c19zY29yZSAtPSBTQ09SRV9ERUwgLSBTQ09SRV9ERUxEVVA7CisJCX0KKwkJYnJlYWs7CisJICAgIH0KKwkgICAgLypGQUxMVEhST1VHSCovCisKKwljYXNlIFNUQVRFX0lOU19QUkVQOgorCSAgICBpZiAoc3AtPnRzX2ZsYWdzICYgVFNGX0RJRERFTCkKKwkgICAgeworCQkvKiBJZiB3ZSBqdXN0IGRlbGV0ZWQgYSBieXRlIHRoZW4gaW5zZXJ0aW5nIHdvbid0IG1ha2Ugc2Vuc2UsCisJCSAqIGEgc3Vic3RpdHV0ZSBpcyBhbHdheXMgY2hlYXBlci4gKi8KKwkJc3AtPnRzX3N0YXRlID0gU1RBVEVfU1dBUDsKKwkJYnJlYWs7CisJICAgIH0KKworCSAgICAvKiBza2lwIG92ZXIgTlVMIGJ5dGVzICovCisJICAgIG4gPSBzcC0+dHNfYXJyaWR4OworCSAgICBmb3IgKDs7KQorCSAgICB7CiAJCWlmIChzcC0+dHNfY3VyaSA+IGJ5dHNbbl0pCiAJCXsKLQkJICAgIC8qIERvbmUgYWxsIGJ5dGVzIGF0IHRoaXMgbm9kZSwgZG8gbmV4dCBzdGF0ZS4gKi8KKwkJICAgIC8qIE9ubHkgTlVMIGJ5dGVzIGF0IHRoaXMgbm9kZSwgZ28gdG8gbmV4dCBzdGF0ZS4gKi8KIAkJICAgIHNwLT50c19zdGF0ZSA9IFNUQVRFX1NXQVA7CisJCSAgICBicmVhazsKKwkJfQorCQlpZiAoYnl0c1tuICsgc3AtPnRzX2N1cmldICE9IE5VTCkKKwkJeworCQkgICAgLyogRm91bmQgYSBieXRlIHRvIGluc2VydC4gKi8KKwkJICAgIHNwLT50c19zdGF0ZSA9IFNUQVRFX0lOUzsKKwkJICAgIGJyZWFrOworCQl9CisJCSsrc3AtPnRzX2N1cmk7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwkgICAgLypGQUxMVEhST1VHSCovCisKKwljYXNlIFNUQVRFX0lOUzoKKwkgICAgLyogSW5zZXJ0IG9uZSBieXRlLiAgUmVwZWF0IHRoaXMgZm9yIGVhY2ggcG9zc2libGUgYnl0ZSBhdCB0aGlzCisJICAgICAqIG5vZGUuICovCisJICAgIG4gPSBzcC0+dHNfYXJyaWR4OworCSAgICBpZiAoc3AtPnRzX2N1cmkgPiBieXRzW25dKQorCSAgICB7CisJCS8qIERvbmUgYWxsIGJ5dGVzIGF0IHRoaXMgbm9kZSwgZ28gdG8gbmV4dCBzdGF0ZS4gKi8KKwkJc3AtPnRzX3N0YXRlID0gU1RBVEVfU1dBUDsKKwkJYnJlYWs7CisJICAgIH0KKworCSAgICAvKiBEbyBvbmUgbW9yZSBieXRlIGF0IHRoaXMgbm9kZSwgYnV0OgorCSAgICAgKiAtIFNraXAgTlVMIGJ5dGVzLgorCSAgICAgKiAtIFNraXAgdGhlIGJ5dGUgaWYgaXQncyBlcXVhbCB0byB0aGUgYnl0ZSBpbiB0aGUgd29yZCwKKwkgICAgICogICBhY2NlcHRpbmcgdGhhdCBieXRlIGlzIGFsd2F5cyBiZXR0ZXIuCisJICAgICAqLworCSAgICBuICs9IHNwLT50c19jdXJpKys7CisJICAgIGMgPSBieXRzW25dOworCSAgICBpZiAoc291bmRmb2xkICYmIHNwLT50c190d29yZGxlbiA9PSAwICYmIGMgPT0gJyonKQorCQkvKiBJbnNlcnRpbmcgYSB2b3dlbCBhdCB0aGUgc3RhcnQgb2YgYSB3b3JkIGNvdW50cyBsZXNzLAorCQkgKiBzZWUgc291bmRhbGlrZV9zY29yZSgpLiAqLworCQluZXdzY29yZSA9IDIgKiBTQ09SRV9JTlMgLyAzOworCSAgICBlbHNlCisJCW5ld3Njb3JlID0gU0NPUkVfSU5TOworCSAgICBpZiAoYyAhPSBmd29yZFtzcC0+dHNfZmlkeF0KKwkJCQkgICAgJiYgVFJZX0RFRVBFUihzdSwgc3RhY2ssIGRlcHRoLCBuZXdzY29yZSkpCisJICAgIHsKKwkJZ29fZGVlcGVyKHN0YWNrLCBkZXB0aCwgbmV3c2NvcmUpOworI2lmZGVmIERFQlVHX1RSSUVXQUxLCisJCXNwcmludGYoY2hhbmdlbmFtZVtkZXB0aF0sICIlLipzLSVzOiBpbnNlcnQgJWMiLAorCQkJc3AtPnRzX3R3b3JkbGVuLCB0d29yZCwgZndvcmQgKyBzcC0+dHNfZmlkeCwKKwkJCWMpOworI2VuZGlmCisJCSsrZGVwdGg7CisJCXNwID0gJnN0YWNrW2RlcHRoXTsKKwkJdHdvcmRbc3AtPnRzX3R3b3JkbGVuKytdID0gYzsKKwkJc3AtPnRzX2FycmlkeCA9IGlkeHNbbl07CisjaWZkZWYgRkVBVF9NQllURQorCQlpZiAoaGFzX21ieXRlKQorCQl7CisJCSAgICBmbCA9IE1CX0JZVEUyTEVOKGMpOworCQkgICAgaWYgKGZsID4gMSkKKwkJICAgIHsKKwkJCS8qIFRoZXJlIGFyZSBmb2xsb3dpbmcgYnl0ZXMgZm9yIHRoZSBzYW1lIGNoYXJhY3Rlci4KKwkJCSAqIFdlIG11c3QgZmluZCBhbGwgYnl0ZXMgYmVmb3JlIHRyeWluZworCQkJICogZGVsZXRlL2luc2VydC9zd2FwL2V0Yy4gKi8KKwkJCXNwLT50c190Y2hhcmxlbiA9IGZsOworCQkJc3AtPnRzX3RjaGFyaWR4ID0gMTsKKwkJCXNwLT50c19pc2RpZmYgPSBESUZGX0lOU0VSVDsKKwkJICAgIH0KIAkJfQogCQllbHNlCi0JCXsKLQkJICAgIC8qIERvIG9uZSBtb3JlIGJ5dGUgYXQgdGhpcyBub2RlLiAgU2tpcCBOVUwgYnl0ZXMuICovCi0JCSAgICBuICs9IHNwLT50c19jdXJpKys7Ci0JCSAgICBjID0gYnl0c1tuXTsKLQkJICAgIGlmIChjICE9IDAgJiYgdHJ5X2RlZXBlcihzdSwgc3RhY2ssIGRlcHRoLCBTQ09SRV9JTlMpKQotCQkgICAgewotCQkJKytkZXB0aDsKLQkJCXNwID0gJnN0YWNrW2RlcHRoXTsKLQkJCXR3b3JkW3NwLT50c190d29yZGxlbisrXSA9IGM7Ci0JCQlzcC0+dHNfYXJyaWR4ID0gaWR4c1tuXTsKLSNpZmRlZiBGRUFUX01CWVRFCi0JCQlpZiAoaGFzX21ieXRlKQotCQkJewotCQkJICAgIGZsID0gTUJfQllURTJMRU4oYyk7Ci0JCQkgICAgaWYgKGZsID4gMSkKLQkJCSAgICB7Ci0JCQkJLyogVGhlcmUgYXJlIGZvbGxvd2luZyBieXRlcyBmb3IgdGhlIHNhbWUKLQkJCQkgKiBjaGFyYWN0ZXIuICBXZSBtdXN0IGZpbmQgYWxsIGJ5dGVzIGJlZm9yZQotCQkJCSAqIHRyeWluZyBkZWxldGUvaW5zZXJ0L3N3YXAvZXRjLiAqLwotCQkJCXNwLT50c190Y2hhcmxlbiA9IGZsOwotCQkJCXNwLT50c190Y2hhcmlkeCA9IDE7Ci0JCQkJc3AtPnRzX2lzZGlmZiA9IERJRkZfSU5TRVJUOwotCQkJICAgIH0KLQkJCX0KLQkJCWVsc2UKLQkJCSAgICBmbCA9IDE7Ci0JCQlpZiAoZmwgPT0gMSkKKwkJICAgIGZsID0gMTsKKwkJaWYgKGZsID09IDEpCiAjZW5kaWYKLQkJCXsKLQkJCSAgICAvKiBJZiB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIHdhcyB0aGUgc2FtZSwgdGh1cwotCQkJICAgICAqIGRvdWJsaW5nIGEgY2hhcmFjdGVyLCBnaXZlIGEgYm9udXMgdG8gdGhlCi0JCQkgICAgICogc2NvcmUuICovCi0JCQkgICAgaWYgKHNwLT50c190d29yZGxlbiA+PSAyCisJCXsKKwkJICAgIC8qIElmIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgd2FzIHRoZSBzYW1lLCB0aHVzIGRvdWJsaW5nIGEKKwkJICAgICAqIGNoYXJhY3RlciwgZ2l2ZSBhIGJvbnVzIHRvIHRoZSBzY29yZS4gIEFsc28gZm9yCisJCSAgICAgKiBzb3VuZGZvbGQgd29yZHMgKGlsbG9naWNhbCBidXQgZG9lcyBnaXZlIGEgYmV0dGVyCisJCSAgICAgKiBzY29yZSkuICovCisJCSAgICBpZiAoc3AtPnRzX3R3b3JkbGVuID49IDIKIAkJCQkJICAgJiYgdHdvcmRbc3AtPnRzX3R3b3JkbGVuIC0gMl0gPT0gYykKLQkJCQlzcC0+dHNfc2NvcmUgLT0gU0NPUkVfSU5TIC0gU0NPUkVfSU5TRFVQOwotCQkJfQotCQkgICAgfQorCQkJc3AtPnRzX3Njb3JlIC09IFNDT1JFX0lOUyAtIFNDT1JFX0lOU0RVUDsKIAkJfQorCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBTVEFURV9TV0FQOgorCSAgICAvKgorCSAgICAgKiBTd2FwIHR3byBieXRlcyBpbiB0aGUgYmFkIHdvcmQ6ICIxMiIgLT4gIjIxIi4KKwkgICAgICogV2UgY2hhbmdlICJmd29yZCIgaGVyZSwgaXQncyBjaGFuZ2VkIGJhY2sgYWZ0ZXJ3YXJkcyBhdAorCSAgICAgKiBTVEFURV9VTlNXQVAuCisJICAgICAqLworCSAgICBwID0gZndvcmQgKyBzcC0+dHNfZmlkeDsKKwkgICAgYyA9ICpwOworCSAgICBpZiAoYyA9PSBOVUwpCisJICAgIHsKKwkJLyogRW5kIG9mIHdvcmQsIGNhbid0IHN3YXAgb3IgcmVwbGFjZS4gKi8KKwkJc3AtPnRzX3N0YXRlID0gU1RBVEVfRklOQUw7CiAJCWJyZWFrOworCSAgICB9CiAKLQkgICAgY2FzZSBTVEFURV9TV0FQOgotCQkvKgotCQkgKiBTd2FwIHR3byBieXRlcyBpbiB0aGUgYmFkIHdvcmQ6ICIxMiIgLT4gIjIxIi4KLQkJICogV2UgY2hhbmdlICJmd29yZCIgaGVyZSwgaXQncyBjaGFuZ2VkIGJhY2sgYWZ0ZXJ3YXJkcy4KLQkJICovCi0JCXAgPSBmd29yZCArIHNwLT50c19maWR4OwotCQljID0gKnA7Ci0JCWlmIChjID09IE5VTCkKLQkJewotCQkgICAgLyogRW5kIG9mIHdvcmQsIGNhbid0IHN3YXAgb3IgcmVwbGFjZS4gKi8KLQkJICAgIHNwLT50c19zdGF0ZSA9IFNUQVRFX0ZJTkFMOwotCQkgICAgYnJlYWs7Ci0JCX0KKwkgICAgLyogRG9uJ3Qgc3dhcCBpZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIG5vdCBhIHdvcmQgY2hhcmFjdGVyLgorCSAgICAgKiBTV0FQMyBldGMuIGFsc28gZG9uJ3QgbWFrZSBzZW5zZSB0aGVuLiAqLworCSAgICBpZiAoIXNvdW5kZm9sZCAmJiAhc3BlbGxfaXN3b3JkcChwLCBjdXJidWYpKQorCSAgICB7CisJCXNwLT50c19zdGF0ZSA9IFNUQVRFX1JFUF9JTkk7CisJCWJyZWFrOworCSAgICB9CiAKLQkJLyogRG9uJ3Qgc3dhcCBpZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIG5vdCBhIHdvcmQgY2hhcmFjdGVyLgotCQkgKiBTV0FQMyBldGMuIGFsc28gZG9uJ3QgbWFrZSBzZW5zZSB0aGVuLiAqLwotCQlpZiAoIXNwZWxsX2lzd29yZHAocCwgY3VyYnVmKSkKLQkJewotCQkgICAgc3AtPnRzX3N0YXRlID0gU1RBVEVfUkVQX0lOSTsKLQkJICAgIGJyZWFrOwotCQl9CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlKQorCSAgICB7CisJCW4gPSBtYl9jcHRyMmxlbihwKTsKKwkJYyA9IG1iX3B0cjJjaGFyKHApOworCQlpZiAoIXNvdW5kZm9sZCAmJiAhc3BlbGxfaXN3b3JkcChwICsgbiwgY3VyYnVmKSkKKwkJICAgIGMyID0gYzsgLyogZG9uJ3Qgc3dhcCBub24td29yZCBjaGFyICovCisJCWVsc2UKKwkJICAgIGMyID0gbWJfcHRyMmNoYXIocCArIG4pOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCSAgICB7CisJCWlmICghc291bmRmb2xkICYmICFzcGVsbF9pc3dvcmRwKHAgKyAxLCBjdXJidWYpKQorCQkgICAgYzIgPSBjOyAvKiBkb24ndCBzd2FwIG5vbi13b3JkIGNoYXIgKi8KKwkJZWxzZQorCQkgICAgYzIgPSBwWzFdOworCSAgICB9CiAKKwkgICAgLyogV2hlbiBjaGFyYWN0ZXJzIGFyZSBpZGVudGljYWwsIHN3YXAgd29uJ3QgZG8gYW55dGhpbmcuCisJICAgICAqIEFsc28gZ2V0IGhlcmUgaWYgdGhlIHNlY29uZCBjaGFyIGlzIG5vdCBhIHdvcmQgY2hhcmFjdGVyLiAqLworCSAgICBpZiAoYyA9PSBjMikKKwkgICAgeworCQlzcC0+dHNfc3RhdGUgPSBTVEFURV9TV0FQMzsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgaWYgKGMyICE9IE5VTCAmJiBUUllfREVFUEVSKHN1LCBzdGFjaywgZGVwdGgsIFNDT1JFX1NXQVApKQorCSAgICB7CisJCWdvX2RlZXBlcihzdGFjaywgZGVwdGgsIFNDT1JFX1NXQVApOworI2lmZGVmIERFQlVHX1RSSUVXQUxLCisJCXNwcmludGYoY2hhbmdlbmFtZVtkZXB0aF0sICIlLipzLSVzOiBzd2FwICVjIGFuZCAlYyIsCisJCQlzcC0+dHNfdHdvcmRsZW4sIHR3b3JkLCBmd29yZCArIHNwLT50c19maWR4LAorCQkJYywgYzIpOworI2VuZGlmCisJCXNwLT50c19zdGF0ZSA9IFNUQVRFX1VOU1dBUDsKKwkJKytkZXB0aDsKICNpZmRlZiBGRUFUX01CWVRFCiAJCWlmIChoYXNfbWJ5dGUpCiAJCXsKLQkJICAgIG4gPSBtYl9jcHRyMmxlbihwKTsKLQkJICAgIGMgPSBtYl9wdHIyY2hhcihwKTsKLQkJICAgIGlmICghc3BlbGxfaXN3b3JkcChwICsgbiwgY3VyYnVmKSkKLQkJCWMyID0gYzsgLyogZG9uJ3Qgc3dhcCBub24td29yZCBjaGFyICovCi0JCSAgICBlbHNlCi0JCQljMiA9IG1iX3B0cjJjaGFyKHAgKyBuKTsKKwkJICAgIGZsID0gbWJfY2hhcjJsZW4oYzIpOworCQkgICAgbWNoX21lbW1vdmUocCwgcCArIG4sIGZsKTsKKwkJICAgIG1iX2NoYXIyYnl0ZXMoYywgcCArIGZsKTsKKwkJICAgIHN0YWNrW2RlcHRoXS50c19maWR4dHJ5ID0gc3AtPnRzX2ZpZHggKyBuICsgZmw7CiAJCX0KIAkJZWxzZQogI2VuZGlmCiAJCXsKLQkJICAgIGlmICghc3BlbGxfaXN3b3JkcChwICsgMSwgY3VyYnVmKSkKLQkJCWMyID0gYzsgLyogZG9uJ3Qgc3dhcCBub24td29yZCBjaGFyICovCi0JCSAgICBlbHNlCi0JCQljMiA9IHBbMV07Ci0JCX0KLQotCQkvKiBXaGVuIGNoYXJhY3RlcnMgYXJlIGlkZW50aWNhbCwgc3dhcCB3b24ndCBkbyBhbnl0aGluZy4KLQkJICogQWxzbyBnZXQgaGVyZSBpZiB0aGUgc2Vjb25kIGNoYXIgaXMgbm90IGEgd29yZCBjaGFyYWN0ZXIuICovCi0JCWlmIChjID09IGMyKQotCQl7Ci0JCSAgICBzcC0+dHNfc3RhdGUgPSBTVEFURV9TV0FQMzsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCWlmIChjMiAhPSBOVUwgJiYgdHJ5X2RlZXBlcihzdSwgc3RhY2ssIGRlcHRoLCBTQ09SRV9TV0FQKSkKLQkJewotCQkgICAgc3AtPnRzX3N0YXRlID0gU1RBVEVfVU5TV0FQOwotCQkgICAgKytkZXB0aDsKLSNpZmRlZiBGRUFUX01CWVRFCi0JCSAgICBpZiAoaGFzX21ieXRlKQotCQkgICAgewotCQkJZmwgPSBtYl9jaGFyMmxlbihjMik7Ci0JCQltY2hfbWVtbW92ZShwLCBwICsgbiwgZmwpOwotCQkJbWJfY2hhcjJieXRlcyhjLCBwICsgZmwpOwotCQkJc3RhY2tbZGVwdGhdLnRzX2ZpZHh0cnkgPSBzcC0+dHNfZmlkeCArIG4gKyBmbDsKLQkJICAgIH0KLQkJICAgIGVsc2UKLSNlbmRpZgotCQkgICAgewotCQkJcFswXSA9IGMyOwotCQkJcFsxXSA9IGM7Ci0JCQlzdGFja1tkZXB0aF0udHNfZmlkeHRyeSA9IHNwLT50c19maWR4ICsgMjsKLQkJICAgIH0KLQkJfQotCQllbHNlCi0JCSAgICAvKiBJZiB0aGlzIHN3YXAgZG9lc24ndCB3b3JrIHRoZW4gU1dBUDMgd29uJ3QgZWl0aGVyLiAqLwotCQkgICAgc3AtPnRzX3N0YXRlID0gU1RBVEVfUkVQX0lOSTsKLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBTVEFURV9VTlNXQVA6Ci0JCS8qIFVuZG8gdGhlIFNUQVRFX1NXQVAgc3dhcDogIjIxIiAtPiAiMTIiLiAqLwotCQlwID0gZndvcmQgKyBzcC0+dHNfZmlkeDsKLSNpZmRlZiBGRUFUX01CWVRFCi0JCWlmIChoYXNfbWJ5dGUpCi0JCXsKLQkJICAgIG4gPSBNQl9CWVRFMkxFTigqcCk7Ci0JCSAgICBjID0gbWJfcHRyMmNoYXIocCArIG4pOwotCQkgICAgbWNoX21lbW1vdmUocCArIE1CX0JZVEUyTEVOKHBbbl0pLCBwLCBuKTsKLQkJICAgIG1iX2NoYXIyYnl0ZXMoYywgcCk7Ci0JCX0KLQkJZWxzZQotI2VuZGlmCi0JCXsKLQkJICAgIGMgPSAqcDsKLQkJICAgICpwID0gcFsxXTsKKwkJICAgIHBbMF0gPSBjMjsKIAkJICAgIHBbMV0gPSBjOworCQkgICAgc3RhY2tbZGVwdGhdLnRzX2ZpZHh0cnkgPSBzcC0+dHNfZmlkeCArIDI7CiAJCX0KLQkJLypGQUxMVEhST1VHSCovCisJICAgIH0KKwkgICAgZWxzZQorCQkvKiBJZiB0aGlzIHN3YXAgZG9lc24ndCB3b3JrIHRoZW4gU1dBUDMgd29uJ3QgZWl0aGVyLiAqLworCQlzcC0+dHNfc3RhdGUgPSBTVEFURV9SRVBfSU5JOworCSAgICBicmVhazsKIAotCSAgICBjYXNlIFNUQVRFX1NXQVAzOgotCQkvKiBTd2FwIHR3byBieXRlcywgc2tpcHBpbmcgb25lOiAiMTIzIiAtPiAiMzIxIi4gIFdlIGNoYW5nZQotCQkgKiAiZndvcmQiIGhlcmUsIGl0J3MgY2hhbmdlZCBiYWNrIGFmdGVyd2FyZHMuICovCisJY2FzZSBTVEFURV9VTlNXQVA6CisJICAgIC8qIFVuZG8gdGhlIFNUQVRFX1NXQVAgc3dhcDogIjIxIiAtPiAiMTIiLiAqLworCSAgICBwID0gZndvcmQgKyBzcC0+dHNfZmlkeDsKKyNpZmRlZiBGRUFUX01CWVRFCisJICAgIGlmIChoYXNfbWJ5dGUpCisJICAgIHsKKwkJbiA9IE1CX0JZVEUyTEVOKCpwKTsKKwkJYyA9IG1iX3B0cjJjaGFyKHAgKyBuKTsKKwkJbWNoX21lbW1vdmUocCArIE1CX0JZVEUyTEVOKHBbbl0pLCBwLCBuKTsKKwkJbWJfY2hhcjJieXRlcyhjLCBwKTsKKwkgICAgfQorCSAgICBlbHNlCisjZW5kaWYKKwkgICAgeworCQljID0gKnA7CisJCSpwID0gcFsxXTsKKwkJcFsxXSA9IGM7CisJICAgIH0KKwkgICAgLypGQUxMVEhST1VHSCovCisKKwljYXNlIFNUQVRFX1NXQVAzOgorCSAgICAvKiBTd2FwIHR3byBieXRlcywgc2tpcHBpbmcgb25lOiAiMTIzIiAtPiAiMzIxIi4gIFdlIGNoYW5nZQorCSAgICAgKiAiZndvcmQiIGhlcmUsIGl0J3MgY2hhbmdlZCBiYWNrIGFmdGVyd2FyZHMgYXQgU1RBVEVfVU5TV0FQMy4gKi8KKwkgICAgcCA9IGZ3b3JkICsgc3AtPnRzX2ZpZHg7CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlKQorCSAgICB7CisJCW4gPSBtYl9jcHRyMmxlbihwKTsKKwkJYyA9IG1iX3B0cjJjaGFyKHApOworCQlmbCA9IG1iX2NwdHIybGVuKHAgKyBuKTsKKwkJYzIgPSBtYl9wdHIyY2hhcihwICsgbik7CisJCWlmICghc291bmRmb2xkICYmICFzcGVsbF9pc3dvcmRwKHAgKyBuICsgZmwsIGN1cmJ1ZikpCisJCSAgICBjMyA9IGM7CS8qIGRvbid0IHN3YXAgbm9uLXdvcmQgY2hhciAqLworCQllbHNlCisJCSAgICBjMyA9IG1iX3B0cjJjaGFyKHAgKyBuICsgZmwpOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCSAgICB7CisJCWMgPSAqcDsKKwkJYzIgPSBwWzFdOworCQlpZiAoIXNvdW5kZm9sZCAmJiAhc3BlbGxfaXN3b3JkcChwICsgMiwgY3VyYnVmKSkKKwkJICAgIGMzID0gYzsJLyogZG9uJ3Qgc3dhcCBub24td29yZCBjaGFyICovCisJCWVsc2UKKwkJICAgIGMzID0gcFsyXTsKKwkgICAgfQorCisJICAgIC8qIFdoZW4gY2hhcmFjdGVycyBhcmUgaWRlbnRpY2FsOiAiMTIxIiB0aGVuIFNXQVAzIHJlc3VsdCBpcworCSAgICAgKiBpZGVudGljYWwsIFJPVDNMIHJlc3VsdCBpcyBzYW1lIGFzIFNXQVA6ICIyMTEiLCBST1QzTCByZXN1bHQgaXMKKwkgICAgICogc2FtZSBhcyBTV0FQIG9uIG5leHQgY2hhcjogIjExMiIuICBUaHVzIHNraXAgYWxsIHN3YXBwaW5nLgorCSAgICAgKiBBbHNvIHNraXAgd2hlbiBjMyBpcyBOVUwuCisJICAgICAqIEFsc28gZ2V0IGhlcmUgd2hlbiB0aGUgdGhpcmQgY2hhcmFjdGVyIGlzIG5vdCBhIHdvcmQgY2hhcmFjdGVyLgorCSAgICAgKiBTZWNvbmQgY2hhcmFjdGVyIG1heSBhbnkgY2hhcjogImEuYiIgLT4gImIuYSIgKi8KKwkgICAgaWYgKGMgPT0gYzMgfHwgYzMgPT0gTlVMKQorCSAgICB7CisJCXNwLT50c19zdGF0ZSA9IFNUQVRFX1JFUF9JTkk7CisJCWJyZWFrOworCSAgICB9CisJICAgIGlmIChUUllfREVFUEVSKHN1LCBzdGFjaywgZGVwdGgsIFNDT1JFX1NXQVAzKSkKKwkgICAgeworCQlnb19kZWVwZXIoc3RhY2ssIGRlcHRoLCBTQ09SRV9TV0FQMyk7CisjaWZkZWYgREVCVUdfVFJJRVdBTEsKKwkJc3ByaW50ZihjaGFuZ2VuYW1lW2RlcHRoXSwgIiUuKnMtJXM6IHN3YXAzICVjIGFuZCAlYyIsCisJCQlzcC0+dHNfdHdvcmRsZW4sIHR3b3JkLCBmd29yZCArIHNwLT50c19maWR4LAorCQkJYywgYzMpOworI2VuZGlmCisJCXNwLT50c19zdGF0ZSA9IFNUQVRFX1VOU1dBUDM7CisJCSsrZGVwdGg7CisjaWZkZWYgRkVBVF9NQllURQorCQlpZiAoaGFzX21ieXRlKQorCQl7CisJCSAgICB0bCA9IG1iX2NoYXIybGVuKGMzKTsKKwkJICAgIG1jaF9tZW1tb3ZlKHAsIHAgKyBuICsgZmwsIHRsKTsKKwkJICAgIG1iX2NoYXIyYnl0ZXMoYzIsIHAgKyB0bCk7CisJCSAgICBtYl9jaGFyMmJ5dGVzKGMsIHAgKyBmbCArIHRsKTsKKwkJICAgIHN0YWNrW2RlcHRoXS50c19maWR4dHJ5ID0gc3AtPnRzX2ZpZHggKyBuICsgZmwgKyB0bDsKKwkJfQorCQllbHNlCisjZW5kaWYKKwkJeworCQkgICAgcFswXSA9IHBbMl07CisJCSAgICBwWzJdID0gYzsKKwkJICAgIHN0YWNrW2RlcHRoXS50c19maWR4dHJ5ID0gc3AtPnRzX2ZpZHggKyAzOworCQl9CisJICAgIH0KKwkgICAgZWxzZQorCQlzcC0+dHNfc3RhdGUgPSBTVEFURV9SRVBfSU5JOworCSAgICBicmVhazsKKworCWNhc2UgU1RBVEVfVU5TV0FQMzoKKwkgICAgLyogVW5kbyBTVEFURV9TV0FQMzogIjMyMSIgLT4gIjEyMyIgKi8KKwkgICAgcCA9IGZ3b3JkICsgc3AtPnRzX2ZpZHg7CisjaWZkZWYgRkVBVF9NQllURQorCSAgICBpZiAoaGFzX21ieXRlKQorCSAgICB7CisJCW4gPSBNQl9CWVRFMkxFTigqcCk7CisJCWMyID0gbWJfcHRyMmNoYXIocCArIG4pOworCQlmbCA9IE1CX0JZVEUyTEVOKHBbbl0pOworCQljID0gbWJfcHRyMmNoYXIocCArIG4gKyBmbCk7CisJCXRsID0gTUJfQllURTJMRU4ocFtuICsgZmxdKTsKKwkJbWNoX21lbW1vdmUocCArIGZsICsgdGwsIHAsIG4pOworCQltYl9jaGFyMmJ5dGVzKGMsIHApOworCQltYl9jaGFyMmJ5dGVzKGMyLCBwICsgdGwpOworCQlwID0gcCArIHRsOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCSAgICB7CisJCWMgPSAqcDsKKwkJKnAgPSBwWzJdOworCQlwWzJdID0gYzsKKwkJKytwOworCSAgICB9CisKKwkgICAgaWYgKCFzb3VuZGZvbGQgJiYgIXNwZWxsX2lzd29yZHAocCwgY3VyYnVmKSkKKwkgICAgeworCQkvKiBNaWRkbGUgY2hhciBpcyBub3QgYSB3b3JkIGNoYXIsIHNraXAgdGhlIHJvdGF0ZS4gIEZpcnN0IGFuZAorCQkgKiB0aGlyZCBjaGFyIHdlcmUgYWxyZWFkeSBjaGVja2VkIGF0IHN3YXAgYW5kIHN3YXAzLiAqLworCQlzcC0+dHNfc3RhdGUgPSBTVEFURV9SRVBfSU5JOworCQlicmVhazsKKwkgICAgfQorCisJICAgIC8qIFJvdGF0ZSB0aHJlZSBjaGFyYWN0ZXJzIGxlZnQ6ICIxMjMiIC0+ICIyMzEiLiAgV2UgY2hhbmdlCisJICAgICAqICJmd29yZCIgaGVyZSwgaXQncyBjaGFuZ2VkIGJhY2sgYWZ0ZXJ3YXJkcyBhdCBTVEFURV9VTlJPVDNMLiAqLworCSAgICBpZiAoVFJZX0RFRVBFUihzdSwgc3RhY2ssIGRlcHRoLCBTQ09SRV9TV0FQMykpCisJICAgIHsKKwkJZ29fZGVlcGVyKHN0YWNrLCBkZXB0aCwgU0NPUkVfU1dBUDMpOworI2lmZGVmIERFQlVHX1RSSUVXQUxLCisJCXAgPSBmd29yZCArIHNwLT50c19maWR4OworCQlzcHJpbnRmKGNoYW5nZW5hbWVbZGVwdGhdLCAiJS4qcy0lczogcm90YXRlIGxlZnQgJWMlYyVjIiwKKwkJCXNwLT50c190d29yZGxlbiwgdHdvcmQsIGZ3b3JkICsgc3AtPnRzX2ZpZHgsCisJCQlwWzBdLCBwWzFdLCBwWzJdKTsKKyNlbmRpZgorCQlzcC0+dHNfc3RhdGUgPSBTVEFURV9VTlJPVDNMOworCQkrK2RlcHRoOwogCQlwID0gZndvcmQgKyBzcC0+dHNfZmlkeDsKICNpZmRlZiBGRUFUX01CWVRFCiAJCWlmIChoYXNfbWJ5dGUpCkBAIC0xMDE2MCwxOTEgKzExNjYzLDEwIEBACiAJCSAgICBuID0gbWJfY3B0cjJsZW4ocCk7CiAJCSAgICBjID0gbWJfcHRyMmNoYXIocCk7CiAJCSAgICBmbCA9IG1iX2NwdHIybGVuKHAgKyBuKTsKLQkJICAgIGMyID0gbWJfcHRyMmNoYXIocCArIG4pOwotCQkgICAgaWYgKCFzcGVsbF9pc3dvcmRwKHAgKyBuICsgZmwsIGN1cmJ1ZikpCi0JCQljMyA9IGM7CS8qIGRvbid0IHN3YXAgbm9uLXdvcmQgY2hhciAqLwotCQkgICAgZWxzZQotCQkJYzMgPSBtYl9wdHIyY2hhcihwICsgbiArIGZsKTsKLQkJfQotCQllbHNlCi0jZW5kaWYKLQkJewotCQkgICAgYyA9ICpwOwotCQkgICAgYzIgPSBwWzFdOwotCQkgICAgaWYgKCFzcGVsbF9pc3dvcmRwKHAgKyAyLCBjdXJidWYpKQotCQkJYzMgPSBjOwkvKiBkb24ndCBzd2FwIG5vbi13b3JkIGNoYXIgKi8KLQkJICAgIGVsc2UKLQkJCWMzID0gcFsyXTsKLQkJfQotCi0JCS8qIFdoZW4gY2hhcmFjdGVycyBhcmUgaWRlbnRpY2FsOiAiMTIxIiB0aGVuIFNXQVAzIHJlc3VsdCBpcwotCQkgKiBpZGVudGljYWwsIFJPVDNMIHJlc3VsdCBpcyBzYW1lIGFzIFNXQVA6ICIyMTEiLCBST1QzTAotCQkgKiByZXN1bHQgaXMgc2FtZSBhcyBTV0FQIG9uIG5leHQgY2hhcjogIjExMiIuICBUaHVzIHNraXAgYWxsCi0JCSAqIHN3YXBwaW5nLiAgQWxzbyBza2lwIHdoZW4gYzMgaXMgTlVMLgotCQkgKiBBbHNvIGdldCBoZXJlIHdoZW4gdGhlIHRoaXJkIGNoYXJhY3RlciBpcyBub3QgYSB3b3JkCi0JCSAqIGNoYXJhY3Rlci4gIFNlY29uZCBjaGFyYWN0ZXIgbWF5IGFueSBjaGFyOiAiYS5iIiAtPiAiYi5hIiAqLwotCQlpZiAoYyA9PSBjMyB8fCBjMyA9PSBOVUwpCi0JCXsKLQkJICAgIHNwLT50c19zdGF0ZSA9IFNUQVRFX1JFUF9JTkk7Ci0JCSAgICBicmVhazsKLQkJfQotCQlpZiAodHJ5X2RlZXBlcihzdSwgc3RhY2ssIGRlcHRoLCBTQ09SRV9TV0FQMykpCi0JCXsKLQkJICAgIHNwLT50c19zdGF0ZSA9IFNUQVRFX1VOU1dBUDM7Ci0JCSAgICArK2RlcHRoOwotI2lmZGVmIEZFQVRfTUJZVEUKLQkJICAgIGlmIChoYXNfbWJ5dGUpCi0JCSAgICB7Ci0JCQl0bCA9IG1iX2NoYXIybGVuKGMzKTsKLQkJCW1jaF9tZW1tb3ZlKHAsIHAgKyBuICsgZmwsIHRsKTsKLQkJCW1iX2NoYXIyYnl0ZXMoYzIsIHAgKyB0bCk7Ci0JCQltYl9jaGFyMmJ5dGVzKGMsIHAgKyBmbCArIHRsKTsKLQkJCXN0YWNrW2RlcHRoXS50c19maWR4dHJ5ID0gc3AtPnRzX2ZpZHggKyBuICsgZmwgKyB0bDsKLQkJICAgIH0KLQkJICAgIGVsc2UKLSNlbmRpZgotCQkgICAgewotCQkJcFswXSA9IHBbMl07Ci0JCQlwWzJdID0gYzsKLQkJCXN0YWNrW2RlcHRoXS50c19maWR4dHJ5ID0gc3AtPnRzX2ZpZHggKyAzOwotCQkgICAgfQotCQl9Ci0JCWVsc2UKLQkJICAgIHNwLT50c19zdGF0ZSA9IFNUQVRFX1JFUF9JTkk7Ci0JCWJyZWFrOwotCi0JICAgIGNhc2UgU1RBVEVfVU5TV0FQMzoKLQkJLyogVW5kbyBTVEFURV9TV0FQMzogIjMyMSIgLT4gIjEyMyIgKi8KLQkJcCA9IGZ3b3JkICsgc3AtPnRzX2ZpZHg7Ci0jaWZkZWYgRkVBVF9NQllURQotCQlpZiAoaGFzX21ieXRlKQotCQl7Ci0JCSAgICBuID0gTUJfQllURTJMRU4oKnApOwotCQkgICAgYzIgPSBtYl9wdHIyY2hhcihwICsgbik7Ci0JCSAgICBmbCA9IE1CX0JZVEUyTEVOKHBbbl0pOwotCQkgICAgYyA9IG1iX3B0cjJjaGFyKHAgKyBuICsgZmwpOwotCQkgICAgdGwgPSBNQl9CWVRFMkxFTihwW24gKyBmbF0pOwotCQkgICAgbWNoX21lbW1vdmUocCArIGZsICsgdGwsIHAsIG4pOwotCQkgICAgbWJfY2hhcjJieXRlcyhjLCBwKTsKLQkJICAgIG1iX2NoYXIyYnl0ZXMoYzIsIHAgKyB0bCk7Ci0JCSAgICBwID0gcCArIHRsOwotCQl9Ci0JCWVsc2UKLSNlbmRpZgotCQl7Ci0JCSAgICBjID0gKnA7Ci0JCSAgICAqcCA9IHBbMl07Ci0JCSAgICBwWzJdID0gYzsKLQkJICAgICsrcDsKLQkJfQotCi0JCWlmICghc3BlbGxfaXN3b3JkcChwLCBjdXJidWYpKQotCQl7Ci0JCSAgICAvKiBNaWRkbGUgY2hhciBpcyBub3QgYSB3b3JkIGNoYXIsIHNraXAgdGhlIHJvdGF0ZS4KLQkJICAgICAqIEZpcnN0IGFuZCB0aGlyZCBjaGFyIHdlcmUgYWxyZWFkeSBjaGVja2VkIGF0IHN3YXAKLQkJICAgICAqIGFuZCBzd2FwMy4gKi8KLQkJICAgIHNwLT50c19zdGF0ZSA9IFNUQVRFX1JFUF9JTkk7Ci0JCSAgICBicmVhazsKLQkJfQotCi0JCS8qIFJvdGF0ZSB0aHJlZSBjaGFyYWN0ZXJzIGxlZnQ6ICIxMjMiIC0+ICIyMzEiLiAgV2UgY2hhbmdlCi0JCSAqICJmd29yZCIgaGVyZSwgaXQncyBjaGFuZ2VkIGJhY2sgYWZ0ZXJ3YXJkcy4gKi8KLQkJaWYgKHRyeV9kZWVwZXIoc3UsIHN0YWNrLCBkZXB0aCwgU0NPUkVfU1dBUDMpKQotCQl7Ci0JCSAgICBzcC0+dHNfc3RhdGUgPSBTVEFURV9VTlJPVDNMOwotCQkgICAgKytkZXB0aDsKLQkJICAgIHAgPSBmd29yZCArIHNwLT50c19maWR4OwotI2lmZGVmIEZFQVRfTUJZVEUKLQkJICAgIGlmIChoYXNfbWJ5dGUpCi0JCSAgICB7Ci0JCQluID0gbWJfY3B0cjJsZW4ocCk7Ci0JCQljID0gbWJfcHRyMmNoYXIocCk7Ci0JCQlmbCA9IG1iX2NwdHIybGVuKHAgKyBuKTsKLQkJCWZsICs9IG1iX2NwdHIybGVuKHAgKyBuICsgZmwpOwotCQkJbWNoX21lbW1vdmUocCwgcCArIG4sIGZsKTsKLQkJCW1iX2NoYXIyYnl0ZXMoYywgcCArIGZsKTsKLQkJCXN0YWNrW2RlcHRoXS50c19maWR4dHJ5ID0gc3AtPnRzX2ZpZHggKyBuICsgZmw7Ci0JCSAgICB9Ci0JCSAgICBlbHNlCi0jZW5kaWYKLQkJICAgIHsKLQkJCWMgPSAqcDsKLQkJCSpwID0gcFsxXTsKLQkJCXBbMV0gPSBwWzJdOwotCQkJcFsyXSA9IGM7Ci0JCQlzdGFja1tkZXB0aF0udHNfZmlkeHRyeSA9IHNwLT50c19maWR4ICsgMzsKLQkJICAgIH0KLQkJfQotCQllbHNlCi0JCSAgICBzcC0+dHNfc3RhdGUgPSBTVEFURV9SRVBfSU5JOwotCQlicmVhazsKLQotCSAgICBjYXNlIFNUQVRFX1VOUk9UM0w6Ci0JCS8qIFVuZG8gUk9UM0w6ICIyMzEiIC0+ICIxMjMiICovCi0JCXAgPSBmd29yZCArIHNwLT50c19maWR4OwotI2lmZGVmIEZFQVRfTUJZVEUKLQkJaWYgKGhhc19tYnl0ZSkKLQkJewotCQkgICAgbiA9IE1CX0JZVEUyTEVOKCpwKTsKLQkJICAgIG4gKz0gTUJfQllURTJMRU4ocFtuXSk7Ci0JCSAgICBjID0gbWJfcHRyMmNoYXIocCArIG4pOwotCQkgICAgdGwgPSBNQl9CWVRFMkxFTihwW25dKTsKLQkJICAgIG1jaF9tZW1tb3ZlKHAgKyB0bCwgcCwgbik7Ci0JCSAgICBtYl9jaGFyMmJ5dGVzKGMsIHApOwotCQl9Ci0JCWVsc2UKLSNlbmRpZgotCQl7Ci0JCSAgICBjID0gcFsyXTsKLQkJICAgIHBbMl0gPSBwWzFdOwotCQkgICAgcFsxXSA9ICpwOwotCQkgICAgKnAgPSBjOwotCQl9Ci0KLQkJLyogUm90YXRlIHRocmVlIGJ5dGVzIHJpZ2h0OiAiMTIzIiAtPiAiMzEyIi4gIFdlIGNoYW5nZQotCQkgKiAiZndvcmQiIGhlcmUsIGl0J3MgY2hhbmdlZCBiYWNrIGFmdGVyd2FyZHMuICovCi0JCWlmICh0cnlfZGVlcGVyKHN1LCBzdGFjaywgZGVwdGgsIFNDT1JFX1NXQVAzKSkKLQkJewotCQkgICAgc3AtPnRzX3N0YXRlID0gU1RBVEVfVU5ST1QzUjsKLQkJICAgICsrZGVwdGg7Ci0JCSAgICBwID0gZndvcmQgKyBzcC0+dHNfZmlkeDsKLSNpZmRlZiBGRUFUX01CWVRFCi0JCSAgICBpZiAoaGFzX21ieXRlKQotCQkgICAgewotCQkJbiA9IG1iX2NwdHIybGVuKHApOwotCQkJbiArPSBtYl9jcHRyMmxlbihwICsgbik7Ci0JCQljID0gbWJfcHRyMmNoYXIocCArIG4pOwotCQkJdGwgPSBtYl9jcHRyMmxlbihwICsgbik7Ci0JCQltY2hfbWVtbW92ZShwICsgdGwsIHAsIG4pOwotCQkJbWJfY2hhcjJieXRlcyhjLCBwKTsKLQkJCXN0YWNrW2RlcHRoXS50c19maWR4dHJ5ID0gc3AtPnRzX2ZpZHggKyBuICsgdGw7Ci0JCSAgICB9Ci0JCSAgICBlbHNlCi0jZW5kaWYKLQkJICAgIHsKLQkJCWMgPSBwWzJdOwotCQkJcFsyXSA9IHBbMV07Ci0JCQlwWzFdID0gKnA7Ci0JCQkqcCA9IGM7Ci0JCQlzdGFja1tkZXB0aF0udHNfZmlkeHRyeSA9IHNwLT50c19maWR4ICsgMzsKLQkJICAgIH0KLQkJfQotCQllbHNlCi0JCSAgICBzcC0+dHNfc3RhdGUgPSBTVEFURV9SRVBfSU5JOwotCQlicmVhazsKLQotCSAgICBjYXNlIFNUQVRFX1VOUk9UM1I6Ci0JCS8qIFVuZG8gUk9UM1I6ICIzMTIiIC0+ICIxMjMiICovCi0JCXAgPSBmd29yZCArIHNwLT50c19maWR4OwotI2lmZGVmIEZFQVRfTUJZVEUKLQkJaWYgKGhhc19tYnl0ZSkKLQkJewotCQkgICAgYyA9IG1iX3B0cjJjaGFyKHApOwotCQkgICAgdGwgPSBNQl9CWVRFMkxFTigqcCk7Ci0JCSAgICBuID0gTUJfQllURTJMRU4ocFt0bF0pOwotCQkgICAgbiArPSBNQl9CWVRFMkxFTihwW3RsICsgbl0pOwotCQkgICAgbWNoX21lbW1vdmUocCwgcCArIHRsLCBuKTsKLQkJICAgIG1iX2NoYXIyYnl0ZXMoYywgcCArIG4pOworCQkgICAgZmwgKz0gbWJfY3B0cjJsZW4ocCArIG4gKyBmbCk7CisJCSAgICBtY2hfbWVtbW92ZShwLCBwICsgbiwgZmwpOworCQkgICAgbWJfY2hhcjJieXRlcyhjLCBwICsgZmwpOworCQkgICAgc3RhY2tbZGVwdGhdLnRzX2ZpZHh0cnkgPSBzcC0+dHNfZmlkeCArIG4gKyBmbDsKIAkJfQogCQllbHNlCiAjZW5kaWYKQEAgLTEwMzUzLDEzOSArMTE2NzUsMjM3IEBACiAJCSAgICAqcCA9IHBbMV07CiAJCSAgICBwWzFdID0gcFsyXTsKIAkJICAgIHBbMl0gPSBjOworCQkgICAgc3RhY2tbZGVwdGhdLnRzX2ZpZHh0cnkgPSBzcC0+dHNfZmlkeCArIDM7CiAJCX0KLQkJLypGQUxMVEhST1VHSCovCisJICAgIH0KKwkgICAgZWxzZQorCQlzcC0+dHNfc3RhdGUgPSBTVEFURV9SRVBfSU5JOworCSAgICBicmVhazsKIAotCSAgICBjYXNlIFNUQVRFX1JFUF9JTkk6Ci0JCS8qIENoZWNrIGlmIG1hdGNoaW5nIHdpdGggUkVQIGl0ZW1zIGZyb20gdGhlIC5hZmYgZmlsZSB3b3VsZAotCQkgKiB3b3JrLiAgUXVpY2tseSBza2lwIGlmOgotCQkgKiAtIHRoZXJlIGFyZSBubyBSRVAgaXRlbXMKLQkJICogLSB0aGUgc2NvcmUgaXMgZ29pbmcgdG8gYmUgdG9vIGhpZ2ggYW55d2F5Ci0JCSAqIC0gYWxyZWFkeSBhcHBsaWVkIGEgUkVQIGl0ZW0gb3Igc3dhcHBlZCBoZXJlICAqLwotCQlpZiAobHAtPmxwX3JlcGxhbmcgPT0gTlVMTAotCQkJfHwgc3AtPnRzX3Njb3JlICsgU0NPUkVfUkVQID49IHN1LT5zdV9tYXhzY29yZQotCQkJfHwgc3AtPnRzX2ZpZHggPCBzcC0+dHNfZmlkeHRyeSkKLQkJewotCQkgICAgc3AtPnRzX3N0YXRlID0gU1RBVEVfRklOQUw7Ci0JCSAgICBicmVhazsKLQkJfQotCQlnYXAgPSAmbHAtPmxwX3JlcGxhbmctPnNsX3JlcDsKLQotCQkvKiBVc2UgdGhlIGZpcnN0IGJ5dGUgdG8gcXVpY2tseSBmaW5kIHRoZSBmaXJzdCBlbnRyeSB0aGF0Ci0JCSAqIG1heSBtYXRjaC4gIElmIHRoZSBpbmRleCBpcyAtMSB0aGVyZSBpcyBub25lLiAqLwotCQlzcC0+dHNfY3VyaSA9IGxwLT5scF9yZXBsYW5nLT5zbF9yZXBfZmlyc3RbZndvcmRbc3AtPnRzX2ZpZHhdXTsKLQkJaWYgKHNwLT50c19jdXJpIDwgMCkKLQkJewotCQkgICAgc3AtPnRzX3N0YXRlID0gU1RBVEVfRklOQUw7Ci0JCSAgICBicmVhazsKLQkJfQotCi0JCXNwLT50c19zdGF0ZSA9IFNUQVRFX1JFUDsKLQkJLypGQUxMVEhST1VHSCovCi0KLQkgICAgY2FzZSBTVEFURV9SRVA6Ci0JCS8qIFRyeSBtYXRjaGluZyB3aXRoIFJFUCBpdGVtcyBmcm9tIHRoZSAuYWZmIGZpbGUuICBGb3IgZWFjaAotCQkgKiBtYXRjaCByZXBsYWNlIHRoZSBjaGFyYWN0ZXJzIGFuZCBjaGVjayBpZiB0aGUgcmVzdWx0aW5nCi0JCSAqIHdvcmQgaXMgdmFsaWQuICovCi0JCXAgPSBmd29yZCArIHNwLT50c19maWR4OwotCi0JCWdhcCA9ICZscC0+bHBfcmVwbGFuZy0+c2xfcmVwOwotCQl3aGlsZSAoc3AtPnRzX2N1cmkgPCBnYXAtPmdhX2xlbikKLQkJewotCQkgICAgZnRwID0gKGZyb210b19UICopZ2FwLT5nYV9kYXRhICsgc3AtPnRzX2N1cmkrKzsKLQkJICAgIGlmICgqZnRwLT5mdF9mcm9tICE9ICpwKQotCQkgICAgewotCQkJLyogcGFzdCBwb3NzaWJsZSBtYXRjaGluZyBlbnRyaWVzICovCi0JCQlzcC0+dHNfY3VyaSA9IGdhcC0+Z2FfbGVuOwotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCSAgICBpZiAoU1RSTkNNUChmdHAtPmZ0X2Zyb20sIHAsIFNUUkxFTihmdHAtPmZ0X2Zyb20pKSA9PSAwCi0JCQkgICAgJiYgdHJ5X2RlZXBlcihzdSwgc3RhY2ssIGRlcHRoLCBTQ09SRV9SRVApKQotCQkgICAgewotCQkJLyogTmVlZCB0byB1bmRvIHRoaXMgYWZ0ZXJ3YXJkcy4gKi8KLQkJCXNwLT50c19zdGF0ZSA9IFNUQVRFX1JFUF9VTkRPOwotCi0JCQkvKiBDaGFuZ2UgdGhlICJmcm9tIiB0byB0aGUgInRvIiBzdHJpbmcuICovCi0JCQkrK2RlcHRoOwotCQkJZmwgPSBTVFJMRU4oZnRwLT5mdF9mcm9tKTsKLQkJCXRsID0gU1RSTEVOKGZ0cC0+ZnRfdG8pOwotCQkJaWYgKGZsICE9IHRsKQotCQkJewotCQkJICAgIG1jaF9tZW1tb3ZlKHAgKyB0bCwgcCArIGZsLCBTVFJMRU4ocCArIGZsKSArIDEpOwotCQkJICAgIHJlcGV4dHJhICs9IHRsIC0gZmw7Ci0JCQl9Ci0JCQltY2hfbWVtbW92ZShwLCBmdHAtPmZ0X3RvLCB0bCk7Ci0JCQlzdGFja1tkZXB0aF0udHNfZmlkeHRyeSA9IHNwLT50c19maWR4ICsgdGw7CisJY2FzZSBTVEFURV9VTlJPVDNMOgorCSAgICAvKiBVbmRvIFJPVDNMOiAiMjMxIiAtPiAiMTIzIiAqLworCSAgICBwID0gZndvcmQgKyBzcC0+dHNfZmlkeDsKICNpZmRlZiBGRUFUX01CWVRFCi0JCQlzdGFja1tkZXB0aF0udHNfdGNoYXJsZW4gPSAwOworCSAgICBpZiAoaGFzX21ieXRlKQorCSAgICB7CisJCW4gPSBNQl9CWVRFMkxFTigqcCk7CisJCW4gKz0gTUJfQllURTJMRU4ocFtuXSk7CisJCWMgPSBtYl9wdHIyY2hhcihwICsgbik7CisJCXRsID0gTUJfQllURTJMRU4ocFtuXSk7CisJCW1jaF9tZW1tb3ZlKHAgKyB0bCwgcCwgbik7CisJCW1iX2NoYXIyYnl0ZXMoYywgcCk7CisJICAgIH0KKwkgICAgZWxzZQogI2VuZGlmCi0JCQlicmVhazsKLQkJICAgIH0KLQkJfQorCSAgICB7CisJCWMgPSBwWzJdOworCQlwWzJdID0gcFsxXTsKKwkJcFsxXSA9ICpwOworCQkqcCA9IGM7CisJICAgIH0KIAotCQlpZiAoc3AtPnRzX2N1cmkgPj0gZ2FwLT5nYV9sZW4gJiYgc3AtPnRzX3N0YXRlID09IFNUQVRFX1JFUCkKLQkJICAgIC8qIE5vIChtb3JlKSBtYXRjaGVzLiAqLwotCQkgICAgc3AtPnRzX3N0YXRlID0gU1RBVEVfRklOQUw7Ci0KLQkJYnJlYWs7Ci0KLQkgICAgY2FzZSBTVEFURV9SRVBfVU5ETzoKLQkJLyogVW5kbyBhIFJFUCByZXBsYWNlbWVudCBhbmQgY29udGludWUgd2l0aCB0aGUgbmV4dCBvbmUuICovCi0JCWZ0cCA9IChmcm9tdG9fVCAqKWxwLT5scF9yZXBsYW5nLT5zbF9yZXAuZ2FfZGF0YQotCQkJCQkJCSAgICArIHNwLT50c19jdXJpIC0gMTsKLQkJZmwgPSBTVFJMRU4oZnRwLT5mdF9mcm9tKTsKLQkJdGwgPSBTVFJMRU4oZnRwLT5mdF90byk7CisJICAgIC8qIFJvdGF0ZSB0aHJlZSBieXRlcyByaWdodDogIjEyMyIgLT4gIjMxMiIuICBXZSBjaGFuZ2UgImZ3b3JkIgorCSAgICAgKiBoZXJlLCBpdCdzIGNoYW5nZWQgYmFjayBhZnRlcndhcmRzIGF0IFNUQVRFX1VOUk9UM1IuICovCisJICAgIGlmIChUUllfREVFUEVSKHN1LCBzdGFjaywgZGVwdGgsIFNDT1JFX1NXQVAzKSkKKwkgICAgeworCQlnb19kZWVwZXIoc3RhY2ssIGRlcHRoLCBTQ09SRV9TV0FQMyk7CisjaWZkZWYgREVCVUdfVFJJRVdBTEsKIAkJcCA9IGZ3b3JkICsgc3AtPnRzX2ZpZHg7Ci0JCWlmIChmbCAhPSB0bCkKKwkJc3ByaW50ZihjaGFuZ2VuYW1lW2RlcHRoXSwgIiUuKnMtJXM6IHJvdGF0ZSByaWdodCAlYyVjJWMiLAorCQkJc3AtPnRzX3R3b3JkbGVuLCB0d29yZCwgZndvcmQgKyBzcC0+dHNfZmlkeCwKKwkJCXBbMF0sIHBbMV0sIHBbMl0pOworI2VuZGlmCisJCXNwLT50c19zdGF0ZSA9IFNUQVRFX1VOUk9UM1I7CisJCSsrZGVwdGg7CisJCXAgPSBmd29yZCArIHNwLT50c19maWR4OworI2lmZGVmIEZFQVRfTUJZVEUKKwkJaWYgKGhhc19tYnl0ZSkKIAkJewotCQkgICAgbWNoX21lbW1vdmUocCArIGZsLCBwICsgdGwsIFNUUkxFTihwICsgdGwpICsgMSk7Ci0JCSAgICByZXBleHRyYSAtPSB0bCAtIGZsOworCQkgICAgbiA9IG1iX2NwdHIybGVuKHApOworCQkgICAgbiArPSBtYl9jcHRyMmxlbihwICsgbik7CisJCSAgICBjID0gbWJfcHRyMmNoYXIocCArIG4pOworCQkgICAgdGwgPSBtYl9jcHRyMmxlbihwICsgbik7CisJCSAgICBtY2hfbWVtbW92ZShwICsgdGwsIHAsIG4pOworCQkgICAgbWJfY2hhcjJieXRlcyhjLCBwKTsKKwkJICAgIHN0YWNrW2RlcHRoXS50c19maWR4dHJ5ID0gc3AtPnRzX2ZpZHggKyBuICsgdGw7CiAJCX0KLQkJbWNoX21lbW1vdmUocCwgZnRwLT5mdF9mcm9tLCBmbCk7Ci0JCXNwLT50c19zdGF0ZSA9IFNUQVRFX1JFUDsKKwkJZWxzZQorI2VuZGlmCisJCXsKKwkJICAgIGMgPSBwWzJdOworCQkgICAgcFsyXSA9IHBbMV07CisJCSAgICBwWzFdID0gKnA7CisJCSAgICAqcCA9IGM7CisJCSAgICBzdGFja1tkZXB0aF0udHNfZmlkeHRyeSA9IHNwLT50c19maWR4ICsgMzsKKwkJfQorCSAgICB9CisJICAgIGVsc2UKKwkJc3AtPnRzX3N0YXRlID0gU1RBVEVfUkVQX0lOSTsKKwkgICAgYnJlYWs7CisKKwljYXNlIFNUQVRFX1VOUk9UM1I6CisJICAgIC8qIFVuZG8gUk9UM1I6ICIzMTIiIC0+ICIxMjMiICovCisJICAgIHAgPSBmd29yZCArIHNwLT50c19maWR4OworI2lmZGVmIEZFQVRfTUJZVEUKKwkgICAgaWYgKGhhc19tYnl0ZSkKKwkgICAgeworCQljID0gbWJfcHRyMmNoYXIocCk7CisJCXRsID0gTUJfQllURTJMRU4oKnApOworCQluID0gTUJfQllURTJMRU4ocFt0bF0pOworCQluICs9IE1CX0JZVEUyTEVOKHBbdGwgKyBuXSk7CisJCW1jaF9tZW1tb3ZlKHAsIHAgKyB0bCwgbik7CisJCW1iX2NoYXIyYnl0ZXMoYywgcCArIG4pOworCSAgICB9CisJICAgIGVsc2UKKyNlbmRpZgorCSAgICB7CisJCWMgPSAqcDsKKwkJKnAgPSBwWzFdOworCQlwWzFdID0gcFsyXTsKKwkJcFsyXSA9IGM7CisJICAgIH0KKwkgICAgLypGQUxMVEhST1VHSCovCisKKwljYXNlIFNUQVRFX1JFUF9JTkk6CisJICAgIC8qIENoZWNrIGlmIG1hdGNoaW5nIHdpdGggUkVQIGl0ZW1zIGZyb20gdGhlIC5hZmYgZmlsZSB3b3VsZCB3b3JrLgorCSAgICAgKiBRdWlja2x5IHNraXAgaWY6CisJICAgICAqIC0gdGhlcmUgYXJlIG5vIFJFUCBpdGVtcyBhbmQgd2UgYXJlIG5vdCBpbiB0aGUgc291bmRmb2xkIHRyaWUKKwkgICAgICogLSB0aGUgc2NvcmUgaXMgZ29pbmcgdG8gYmUgdG9vIGhpZ2ggYW55d2F5CisJICAgICAqIC0gYWxyZWFkeSBhcHBsaWVkIGEgUkVQIGl0ZW0gb3Igc3dhcHBlZCBoZXJlICAqLworCSAgICBpZiAoKGxwLT5scF9yZXBsYW5nID09IE5VTEwgJiYgIXNvdW5kZm9sZCkKKwkJICAgIHx8IHNwLT50c19zY29yZSArIFNDT1JFX1JFUCA+PSBzdS0+c3VfbWF4c2NvcmUKKwkJICAgIHx8IHNwLT50c19maWR4IDwgc3AtPnRzX2ZpZHh0cnkpCisJICAgIHsKKwkJc3AtPnRzX3N0YXRlID0gU1RBVEVfRklOQUw7CiAJCWJyZWFrOworCSAgICB9CiAKLQkgICAgZGVmYXVsdDoKLQkJLyogRGlkIGFsbCBwb3NzaWJsZSBzdGF0ZXMgYXQgdGhpcyBsZXZlbCwgZ28gdXAgb25lIGxldmVsLiAqLwotCQktLWRlcHRoOworCSAgICAvKiBVc2UgdGhlIGZpcnN0IGJ5dGUgdG8gcXVpY2tseSBmaW5kIHRoZSBmaXJzdCBlbnRyeSB0aGF0IG1heQorCSAgICAgKiBtYXRjaC4gIElmIHRoZSBpbmRleCBpcyAtMSB0aGVyZSBpcyBub25lLiAqLworCSAgICBpZiAoc291bmRmb2xkKQorCQlzcC0+dHNfY3VyaSA9IHNsYW5nLT5zbF9yZXBzYWxfZmlyc3RbZndvcmRbc3AtPnRzX2ZpZHhdXTsKKwkgICAgZWxzZQorCQlzcC0+dHNfY3VyaSA9IGxwLT5scF9yZXBsYW5nLT5zbF9yZXBfZmlyc3RbZndvcmRbc3AtPnRzX2ZpZHhdXTsKIAotCQlpZiAoZGVwdGggPj0gMCAmJiBzdGFja1tkZXB0aF0udHNfcHJlZml4ZGVwdGggPT0gUEZEX1BSRUZJWFRSRUUpCisJICAgIGlmIChzcC0+dHNfY3VyaSA8IDApCisJICAgIHsKKwkJc3AtPnRzX3N0YXRlID0gU1RBVEVfRklOQUw7CisJCWJyZWFrOworCSAgICB9CisKKwkgICAgc3AtPnRzX3N0YXRlID0gU1RBVEVfUkVQOworCSAgICAvKkZBTExUSFJPVUdIKi8KKworCWNhc2UgU1RBVEVfUkVQOgorCSAgICAvKiBUcnkgbWF0Y2hpbmcgd2l0aCBSRVAgaXRlbXMgZnJvbSB0aGUgLmFmZiBmaWxlLiAgRm9yIGVhY2ggbWF0Y2gKKwkgICAgICogcmVwbGFjZSB0aGUgY2hhcmFjdGVycyBhbmQgY2hlY2sgaWYgdGhlIHJlc3VsdGluZyB3b3JkIGlzCisJICAgICAqIHZhbGlkLiAqLworCSAgICBwID0gZndvcmQgKyBzcC0+dHNfZmlkeDsKKworCSAgICBpZiAoc291bmRmb2xkKQorCQlnYXAgPSAmc2xhbmctPnNsX3JlcHNhbDsKKwkgICAgZWxzZQorCQlnYXAgPSAmbHAtPmxwX3JlcGxhbmctPnNsX3JlcDsKKwkgICAgd2hpbGUgKHNwLT50c19jdXJpIDwgZ2FwLT5nYV9sZW4pCisJICAgIHsKKwkJZnRwID0gKGZyb210b19UICopZ2FwLT5nYV9kYXRhICsgc3AtPnRzX2N1cmkrKzsKKwkJaWYgKCpmdHAtPmZ0X2Zyb20gIT0gKnApCiAJCXsKLQkJICAgIC8qIENvbnRpbnVlIGluIG9yIGdvIGJhY2sgdG8gdGhlIHByZWZpeCB0cmVlLiAqLwotCQkgICAgYnl0cyA9IHBieXRzOwotCQkgICAgaWR4cyA9IHBpZHhzOworCQkgICAgLyogcGFzdCBwb3NzaWJsZSBtYXRjaGluZyBlbnRyaWVzICovCisJCSAgICBzcC0+dHNfY3VyaSA9IGdhcC0+Z2FfbGVuOworCQkgICAgYnJlYWs7CiAJCX0KKwkJaWYgKFNUUk5DTVAoZnRwLT5mdF9mcm9tLCBwLCBTVFJMRU4oZnRwLT5mdF9mcm9tKSkgPT0gMAorCQkJJiYgVFJZX0RFRVBFUihzdSwgc3RhY2ssIGRlcHRoLCBTQ09SRV9SRVApKQorCQl7CisJCSAgICBnb19kZWVwZXIoc3RhY2ssIGRlcHRoLCBTQ09SRV9SRVApOworI2lmZGVmIERFQlVHX1RSSUVXQUxLCisJCSAgICBzcHJpbnRmKGNoYW5nZW5hbWVbZGVwdGhdLCAiJS4qcy0lczogcmVwbGFjZSAlcyB3aXRoICVzIiwKKwkJCSAgICBzcC0+dHNfdHdvcmRsZW4sIHR3b3JkLCBmd29yZCArIHNwLT50c19maWR4LAorCQkJICAgIGZ0cC0+ZnRfZnJvbSwgZnRwLT5mdF90byk7CisjZW5kaWYKKwkJICAgIC8qIE5lZWQgdG8gdW5kbyB0aGlzIGFmdGVyd2FyZHMuICovCisJCSAgICBzcC0+dHNfc3RhdGUgPSBTVEFURV9SRVBfVU5ETzsKIAotCQkvKiBEb24ndCBjaGVjayBmb3IgQ1RSTC1DIHRvbyBvZnRlbiwgaXQgdGFrZXMgdGltZS4gKi8KLQkJbGluZV9icmVha2NoZWNrKCk7CisJCSAgICAvKiBDaGFuZ2UgdGhlICJmcm9tIiB0byB0aGUgInRvIiBzdHJpbmcuICovCisJCSAgICArK2RlcHRoOworCQkgICAgZmwgPSBTVFJMRU4oZnRwLT5mdF9mcm9tKTsKKwkJICAgIHRsID0gU1RSTEVOKGZ0cC0+ZnRfdG8pOworCQkgICAgaWYgKGZsICE9IHRsKQorCQkgICAgeworCQkJbWNoX21lbW1vdmUocCArIHRsLCBwICsgZmwsIFNUUkxFTihwICsgZmwpICsgMSk7CisJCQlyZXBleHRyYSArPSB0bCAtIGZsOworCQkgICAgfQorCQkgICAgbWNoX21lbW1vdmUocCwgZnRwLT5mdF90bywgdGwpOworCQkgICAgc3RhY2tbZGVwdGhdLnRzX2ZpZHh0cnkgPSBzcC0+dHNfZmlkeCArIHRsOworI2lmZGVmIEZFQVRfTUJZVEUKKwkJICAgIHN0YWNrW2RlcHRoXS50c190Y2hhcmxlbiA9IDA7CisjZW5kaWYKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKworCSAgICBpZiAoc3AtPnRzX2N1cmkgPj0gZ2FwLT5nYV9sZW4gJiYgc3AtPnRzX3N0YXRlID09IFNUQVRFX1JFUCkKKwkJLyogTm8gKG1vcmUpIG1hdGNoZXMuICovCisJCXNwLT50c19zdGF0ZSA9IFNUQVRFX0ZJTkFMOworCisJICAgIGJyZWFrOworCisJY2FzZSBTVEFURV9SRVBfVU5ETzoKKwkgICAgLyogVW5kbyBhIFJFUCByZXBsYWNlbWVudCBhbmQgY29udGludWUgd2l0aCB0aGUgbmV4dCBvbmUuICovCisJICAgIGlmIChzb3VuZGZvbGQpCisJCWdhcCA9ICZzbGFuZy0+c2xfcmVwc2FsOworCSAgICBlbHNlCisJCWdhcCA9ICZscC0+bHBfcmVwbGFuZy0+c2xfcmVwOworCSAgICBmdHAgPSAoZnJvbXRvX1QgKilnYXAtPmdhX2RhdGEgKyBzcC0+dHNfY3VyaSAtIDE7CisJICAgIGZsID0gU1RSTEVOKGZ0cC0+ZnRfZnJvbSk7CisJICAgIHRsID0gU1RSTEVOKGZ0cC0+ZnRfdG8pOworCSAgICBwID0gZndvcmQgKyBzcC0+dHNfZmlkeDsKKwkgICAgaWYgKGZsICE9IHRsKQorCSAgICB7CisJCW1jaF9tZW1tb3ZlKHAgKyBmbCwgcCArIHRsLCBTVFJMRU4ocCArIHRsKSArIDEpOworCQlyZXBleHRyYSAtPSB0bCAtIGZsOworCSAgICB9CisJICAgIG1jaF9tZW1tb3ZlKHAsIGZ0cC0+ZnRfZnJvbSwgZmwpOworCSAgICBzcC0+dHNfc3RhdGUgPSBTVEFURV9SRVA7CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgLyogRGlkIGFsbCBwb3NzaWJsZSBzdGF0ZXMgYXQgdGhpcyBsZXZlbCwgZ28gdXAgb25lIGxldmVsLiAqLworCSAgICAtLWRlcHRoOworCisJICAgIGlmIChkZXB0aCA+PSAwICYmIHN0YWNrW2RlcHRoXS50c19wcmVmaXhkZXB0aCA9PSBQRkRfUFJFRklYVFJFRSkKKwkgICAgeworCQkvKiBDb250aW51ZSBpbiBvciBnbyBiYWNrIHRvIHRoZSBwcmVmaXggdHJlZS4gKi8KKwkJYnl0cyA9IHBieXRzOworCQlpZHhzID0gcGlkeHM7CisJICAgIH0KKworCSAgICAvKiBEb24ndCBjaGVjayBmb3IgQ1RSTC1DIHRvbyBvZnRlbiwgaXQgdGFrZXMgdGltZS4gKi8KKwkgICAgaWYgKC0tYnJlYWtjaGVja2NvdW50ID09IDApCisJICAgIHsKKwkJdWlfYnJlYWtjaGVjaygpOworCQlicmVha2NoZWNrY291bnQgPSAxMDAwOwogCSAgICB9CiAJfQogICAgIH0KIH0KIAorCiAvKgotICogVHJ5IGdvaW5nIG9uZSBsZXZlbCBkZWVwZXIgaW4gdGhlIHRyZWUuCisgKiBHbyBvbmUgbGV2ZWwgZGVlcGVyIGluIHRoZSB0cmVlLgogICovCi0gICAgc3RhdGljIGludAotdHJ5X2RlZXBlcihzdSwgc3RhY2ssIGRlcHRoLCBzY29yZV9hZGQpCi0gICAgc3VnaW5mb19UCSpzdTsKKyAgICBzdGF0aWMgdm9pZAorZ29fZGVlcGVyKHN0YWNrLCBkZXB0aCwgc2NvcmVfYWRkKQogICAgIHRyeXN0YXRlX1QJKnN0YWNrOwogICAgIGludAkJZGVwdGg7CiAgICAgaW50CQlzY29yZV9hZGQ7CiB7Ci0gICAgaW50CQluZXdzY29yZTsKLQotICAgIC8qIFJlZnVzZSB0byBnbyBkZWVwZXIgaWYgdGhlIHNjcm9yZSBpcyBnZXR0aW5nIHRvbyBiaWcuICovCi0gICAgbmV3c2NvcmUgPSBzdGFja1tkZXB0aF0udHNfc2NvcmUgKyBzY29yZV9hZGQ7Ci0gICAgaWYgKG5ld3Njb3JlID49IHN1LT5zdV9tYXhzY29yZSkKLQlyZXR1cm4gRkFMU0U7Ci0KICAgICBzdGFja1tkZXB0aCArIDFdID0gc3RhY2tbZGVwdGhdOwogICAgIHN0YWNrW2RlcHRoICsgMV0udHNfc3RhdGUgPSBTVEFURV9TVEFSVDsKLSAgICBzdGFja1tkZXB0aCArIDFdLnRzX3Njb3JlID0gbmV3c2NvcmU7CisgICAgc3RhY2tbZGVwdGggKyAxXS50c19zY29yZSA9IHN0YWNrW2RlcHRoXS50c19zY29yZSArIHNjb3JlX2FkZDsKICAgICBzdGFja1tkZXB0aCArIDFdLnRzX2N1cmkgPSAxOwkvKiBzdGFydCBqdXN0IGFmdGVyIGxlbmd0aCBieXRlICovCiAgICAgc3RhY2tbZGVwdGggKyAxXS50c19mbGFncyA9IDA7Ci0gICAgcmV0dXJuIFRSVUU7CiB9CiAKICNpZmRlZiBGRUFUX01CWVRFCkBAIC0xMDcxMyw2ICsxMjEzMyw3IEBACiAJCSAgICBzc3RwLT5zdF93b3JkID0gdmltX3N0cnNhdmUoc3RwLT5zdF93b3JkKTsKIAkJICAgIGlmIChzc3RwLT5zdF93b3JkICE9IE5VTEwpCiAJCSAgICB7CisJCQlzc3RwLT5zdF93b3JkbGVuID0gc3RwLT5zdF93b3JkbGVuOwogCQkJc3N0cC0+c3Rfc2NvcmUgPSBzY29yZTsKIAkJCXNzdHAtPnN0X2FsdHNjb3JlID0gMDsKIAkJCXNzdHAtPnN0X29yZ2xlbiA9IHN0cC0+c3Rfb3JnbGVuOwpAQCAtMTA3NDMsNiArMTIxNjQsNyBAQAogICAgIGNoYXJfdQliYWRzb3VuZFtNQVhXTEVOXTsKICAgICBpbnQJCXJvdW5kOwogICAgIGludAkJbHBpOworICAgIHNsYW5nX1QJKnNsYW5nID0gTlVMTDsKIAogICAgIC8qIEFkZCB0aGUgYWx0ZXJuYXRlIHNjb3JlIHRvIHN1X2dhLiAqLwogICAgIGZvciAobHBpID0gMDsgbHBpIDwgY3VyYnVmLT5iX2xhbmdwLmdhX2xlbjsgKytscGkpCkBAIC0xMDc1MSwxMyArMTIxNzMsMTMgQEAKIAlpZiAobHAtPmxwX3NsYW5nLT5zbF9zYWwuZ2FfbGVuID4gMCkKIAl7CiAJICAgIC8qIHNvdW5kZm9sZCB0aGUgYmFkIHdvcmQgKi8KLQkgICAgc3BlbGxfc291bmRmb2xkKGxwLT5scF9zbGFuZywgc3UtPnN1X2ZiYWR3b3JkLCBUUlVFLCBiYWRzb3VuZCk7CisJICAgIHNsYW5nID0gbHAtPmxwX3NsYW5nOworCSAgICBzcGVsbF9zb3VuZGZvbGQoc2xhbmcsIHN1LT5zdV9mYmFkd29yZCwgVFJVRSwgYmFkc291bmQpOwogCiAJICAgIGZvciAoaSA9IDA7IGkgPCBzdS0+c3VfZ2EuZ2FfbGVuOyArK2kpCiAJICAgIHsKIAkJc3RwID0gJlNVRyhzdS0+c3VfZ2EsIGkpOwotCQlzdHAtPnN0X2FsdHNjb3JlID0gc3RwX3NhbF9zY29yZShzdHAsIHN1LCBscC0+bHBfc2xhbmcsCi0JCQkJCQkJCSAgICBiYWRzb3VuZCk7CisJCXN0cC0+c3RfYWx0c2NvcmUgPSBzdHBfc2FsX3Njb3JlKHN0cCwgc3UsIHNsYW5nLCBiYWRzb3VuZCk7CiAJCWlmIChzdHAtPnN0X2FsdHNjb3JlID09IFNDT1JFX01BWE1BWCkKIAkJICAgIHN0cC0+c3Rfc2NvcmUgPSAoc3RwLT5zdF9zY29yZSAqIDMgKyBTQ09SRV9CSUcpIC8gNDsKIAkJZWxzZQpAQCAtMTA3NjksMTEgKzEyMTkxLDE1IEBACiAJfQogICAgIH0KIAorICAgIGlmIChzbGFuZyA9PSBOVUxMKQkvKiBqdXN0IGluIGNhc2UgKi8KKwlyZXR1cm47CisKICAgICAvKiBBZGQgdGhlIGFsdGVybmF0ZSBzY29yZSB0byBzdV9zZ2EuICovCiAgICAgZm9yIChpID0gMDsgaSA8IHN1LT5zdV9zZ2EuZ2FfbGVuOyArK2kpCiAgICAgewogCXN0cCA9ICZTVUcoc3UtPnN1X3NnYSwgaSk7Ci0Jc3RwLT5zdF9hbHRzY29yZSA9IHNwZWxsX2VkaXRfc2NvcmUoc3UtPnN1X2JhZHdvcmQsIHN0cC0+c3Rfd29yZCk7CisJc3RwLT5zdF9hbHRzY29yZSA9IHNwZWxsX2VkaXRfc2NvcmUoc2xhbmcsCisJCQkJCQlzdS0+c3VfYmFkd29yZCwgc3RwLT5zdF93b3JkKTsKIAlpZiAoc3RwLT5zdF9zY29yZSA9PSBTQ09SRV9NQVhNQVgpCiAJICAgIHN0cC0+c3Rfc2NvcmUgPSAoU0NPUkVfQklHICogNyArIHN0cC0+c3RfYWx0c2NvcmUpIC8gODsKIAllbHNlCkBAIC0xMDc4MSw4ICsxMjIwNywxMSBAQAogCXN0cC0+c3Rfc2Fsc2NvcmUgPSBUUlVFOwogICAgIH0KIAotICAgIC8qIFNvcnQgdGhlIHN1Z2dlc3Rpb25zIGFuZCB0cnVuY2F0ZSBhdCAibWF4Y291bnQiIGZvciBib3RoIGxpc3RzLiAqLworICAgIC8qIFJlbW92ZSBiYWQgc3VnZ2VzdGlvbnMsIHNvcnQgdGhlIHN1Z2dlc3Rpb25zIGFuZCB0cnVuY2F0ZSBhdCAibWF4Y291bnQiCisgICAgICogZm9yIGJvdGggbGlzdHMuICovCisgICAgY2hlY2tfc3VnZ2VzdGlvbnMoc3UsICZzdS0+c3VfZ2EpOwogICAgICh2b2lkKWNsZWFudXBfc3VnZ2VzdGlvbnMoJnN1LT5zdV9nYSwgc3UtPnN1X21heHNjb3JlLCBzdS0+c3VfbWF4Y291bnQpOworICAgIGNoZWNrX3N1Z2dlc3Rpb25zKHN1LCAmc3UtPnN1X3NnYSk7CiAgICAgKHZvaWQpY2xlYW51cF9zdWdnZXN0aW9ucygmc3UtPnN1X3NnYSwgc3UtPnN1X21heHNjb3JlLCBzdS0+c3VfbWF4Y291bnQpOwogCiAgICAgZ2FfaW5pdDIoJmdhLCAoaW50KXNpemVvZihzdWdpbmZvX1QpLCAxKTsKQEAgLTEwODcyLDcgKzEyMzAxLDggQEAKIAkvKiBBZGQgcGFydCBvZiB0aGUgYmFkIHdvcmQgdG8gdGhlIGdvb2Qgd29yZCwgc28gdGhhdCB3ZSBzb3VuZGZvbGQKIAkgKiB3aGF0IHJlcGxhY2VzIHRoZSBiYWQgd29yZC4gKi8KIAlTVFJDUFkoZ29vZHdvcmQsIHN0cC0+c3Rfd29yZCk7Ci0JU1RSTkNBVChnb29kd29yZCwgc3UtPnN1X2JhZHB0ciArIHN1LT5zdV9iYWRsZW4gLSBsZW5kaWZmLCBsZW5kaWZmKTsKKwl2aW1fc3RybmNweShnb29kd29yZCArIHN0cC0+c3Rfd29yZGxlbiwKKwkJCSAgICBzdS0+c3VfYmFkcHRyICsgc3UtPnN1X2JhZGxlbiAtIGxlbmRpZmYsIGxlbmRpZmYpOwogCXBnb29kID0gZ29vZHdvcmQ7CiAgICAgfQogICAgIGVsc2UKQEAgLTEwODg0LDYgKzEyMzE0LDQwIEBACiAgICAgcmV0dXJuIHNvdW5kYWxpa2Vfc2NvcmUoZ29vZHNvdW5kLCBwYmFkKTsKIH0KIAorLyogc3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgc291bmRmb2xkZWQgd29yZHMgdGhhdCBhZGRfc291bmRfc3VnZ2VzdCgpIGhhcworICogaGFuZGxlZCBhbHJlYWR5LiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBzaG9ydAlzZnRfc2NvcmU7CS8qIGxvd2VzdCBzY29yZSB1c2VkICovCisgICAgY2hhcl91CXNmdF93b3JkWzFdOyAgICAvKiBzb3VuZGZvbGRlZCB3b3JkLCBhY3R1YWxseSBsb25nZXIgKi8KK30gc2Z0d29yZF9UOworCitzdGF0aWMgc2Z0d29yZF9UIGR1bXNmdDsKKyNkZWZpbmUgSElLRVkyU0ZUKHApICAoKHNmdHdvcmRfVCAqKShwIC0gKGR1bXNmdC5zZnRfd29yZCAtIChjaGFyX3UgKikmZHVtc2Z0KSkpCisjZGVmaW5lIEhJMlNGVChoaSkgICAgIEhJS0VZMlNGVCgoaGkpLT5oaV9rZXkpCisKKy8qCisgKiBQcmVwYXJlIGZvciBjYWxsaW5nIHN1Z2dlc3RfdHJ5X3NvdW5kYWxpa2UoKS4KKyAqLworICAgIHN0YXRpYyB2b2lkCitzdWdnZXN0X3RyeV9zb3VuZGFsaWtlX3ByZXAoKQoreworICAgIGxhbmdwX1QJKmxwOworICAgIGludAkJbHBpOworICAgIHNsYW5nX1QJKnNsYW5nOworCisgICAgLyogRG8gdGhpcyBmb3IgYWxsIGxhbmd1YWdlcyB0aGF0IHN1cHBvcnQgc291bmQgZm9sZGluZyBhbmQgZm9yIHdoaWNoIGEKKyAgICAgKiAuc3VnIGZpbGUgaGFzIGJlZW4gbG9hZGVkLiAqLworICAgIGZvciAobHBpID0gMDsgbHBpIDwgY3VyYnVmLT5iX2xhbmdwLmdhX2xlbjsgKytscGkpCisgICAgeworCWxwID0gTEFOR1BfRU5UUlkoY3VyYnVmLT5iX2xhbmdwLCBscGkpOworCXNsYW5nID0gbHAtPmxwX3NsYW5nOworCWlmIChzbGFuZy0+c2xfc2FsLmdhX2xlbiA+IDAgJiYgc2xhbmctPnNsX3NieXRzICE9IE5VTEwpCisJICAgIC8qIHByZXBhcmUgdGhlIGhhc2h0YWJsZSB1c2VkIGJ5IGFkZF9zb3VuZF9zdWdnZXN0KCkgKi8KKwkgICAgaGFzaF9pbml0KCZzbGFuZy0+c2xfc291bmRkb25lKTsKKyAgICB9Cit9CisKIC8qCiAgKiBGaW5kIHN1Z2dlc3Rpb25zIGJ5IGNvbXBhcmluZyB0aGUgd29yZCBpbiBhIHNvdW5kLWEtbGlrZSBmb3JtLgogICogTm90ZTogVGhpcyBkb2Vzbid0IHN1cHBvcnQgcG9zdHBvbmVkIHByZWZpeGVzLgpAQCAtMTA4OTMsMTY0ICsxMjM1NywzNDMgQEAKICAgICBzdWdpbmZvX1QJKnN1OwogewogICAgIGNoYXJfdQlzYWx3b3JkW01BWFdMRU5dOwotICAgIGNoYXJfdQl0d29yZFtNQVhXTEVOXTsKLSAgICBjaGFyX3UJdHNhbHdvcmRbTUFYV0xFTl07Ci0gICAgaWR4X1QJYXJyaWR4W01BWFdMRU5dOwotICAgIGludAkJY3VyaVtNQVhXTEVOXTsKICAgICBsYW5ncF9UCSpscDsKLSAgICBjaGFyX3UJKmJ5dHM7Ci0gICAgaWR4X1QJKmlkeHM7Ci0gICAgaW50CQlkZXB0aDsKLSAgICBpbnQJCWM7Ci0gICAgaWR4X1QJbjsKLSAgICBpbnQJCXJvdW5kOwotICAgIGludAkJZmxhZ3M7Ci0gICAgaW50CQlzb3VuZF9zY29yZTsKLSAgICBpbnQJCWxvY2FsX3Njb3JlOwogICAgIGludAkJbHBpOwogICAgIHNsYW5nX1QJKnNsYW5nOwogCi0gICAgLyogRG8gdGhpcyBmb3IgYWxsIGxhbmd1YWdlcyB0aGF0IHN1cHBvcnQgc291bmQgZm9sZGluZy4gKi8KKyAgICAvKiBEbyB0aGlzIGZvciBhbGwgbGFuZ3VhZ2VzIHRoYXQgc3VwcG9ydCBzb3VuZCBmb2xkaW5nIGFuZCBmb3Igd2hpY2ggYQorICAgICAqIC5zdWcgZmlsZSBoYXMgYmVlbiBsb2FkZWQuICovCiAgICAgZm9yIChscGkgPSAwOyBscGkgPCBjdXJidWYtPmJfbGFuZ3AuZ2FfbGVuOyArK2xwaSkKICAgICB7CiAJbHAgPSBMQU5HUF9FTlRSWShjdXJidWYtPmJfbGFuZ3AsIGxwaSk7CiAJc2xhbmcgPSBscC0+bHBfc2xhbmc7Ci0JaWYgKHNsYW5nLT5zbF9zYWwuZ2FfbGVuID4gMCkKKwlpZiAoc2xhbmctPnNsX3NhbC5nYV9sZW4gPiAwICYmIHNsYW5nLT5zbF9zYnl0cyAhPSBOVUxMKQogCXsKIAkgICAgLyogc291bmRmb2xkIHRoZSBiYWQgd29yZCAqLwogCSAgICBzcGVsbF9zb3VuZGZvbGQoc2xhbmcsIHN1LT5zdV9mYmFkd29yZCwgVFJVRSwgc2Fsd29yZCk7CiAKLQkgICAgLyoKLQkgICAgICogR28gdGhyb3VnaCB0aGUgd2hvbGUgdHJlZSwgc291bmRmb2xkIGVhY2ggd29yZCBhbmQgY29tcGFyZS4KLQkgICAgICogcm91bmQgMTogdXNlIHRoZSBjYXNlLWZvbGRlZCB0cmVlLgotCSAgICAgKiByb3VuZCAyOiB1c2UgdGhlIGtlZXAtY2FzZSB0cmVlLgotCSAgICAgKi8KLQkgICAgZm9yIChyb3VuZCA9IDE7IHJvdW5kIDw9IDI7ICsrcm91bmQpCi0JICAgIHsKLQkJaWYgKHJvdW5kID09IDEpCisJICAgIC8qIHRyeSBhbGwga2luZHMgb2YgaW5zZXJ0cy9kZWxldGVzL3N3YXBzL2V0Yy4gKi8KKwkgICAgLyogVE9ETzogYWxzbyBzb3VuZGZvbGQgdGhlIG5leHQgd29yZHMsIHNvIHRoYXQgd2UgY2FuIHRyeSBqb2luaW5nCisJICAgICAqIGFuZCBzcGxpdHRpbmcgKi8KKwkgICAgc3VnZ2VzdF90cmllX3dhbGsoc3UsIGxwLCBzYWx3b3JkLCBUUlVFKTsKKwl9CisgICAgfQorfQorCisvKgorICogRmluaXNoIHVwIGFmdGVyIGNhbGxpbmcgc3VnZ2VzdF90cnlfc291bmRhbGlrZSgpLgorICovCisgICAgc3RhdGljIHZvaWQKK3N1Z2dlc3RfdHJ5X3NvdW5kYWxpa2VfZmluaXNoKCkKK3sKKyAgICBsYW5ncF9UCSpscDsKKyAgICBpbnQJCWxwaTsKKyAgICBzbGFuZ19UCSpzbGFuZzsKKyAgICBpbnQJCXRvZG87CisgICAgaGFzaGl0ZW1fVAkqaGk7CisKKyAgICAvKiBEbyB0aGlzIGZvciBhbGwgbGFuZ3VhZ2VzIHRoYXQgc3VwcG9ydCBzb3VuZCBmb2xkaW5nIGFuZCBmb3Igd2hpY2ggYQorICAgICAqIC5zdWcgZmlsZSBoYXMgYmVlbiBsb2FkZWQuICovCisgICAgZm9yIChscGkgPSAwOyBscGkgPCBjdXJidWYtPmJfbGFuZ3AuZ2FfbGVuOyArK2xwaSkKKyAgICB7CisJbHAgPSBMQU5HUF9FTlRSWShjdXJidWYtPmJfbGFuZ3AsIGxwaSk7CisJc2xhbmcgPSBscC0+bHBfc2xhbmc7CisJaWYgKHNsYW5nLT5zbF9zYWwuZ2FfbGVuID4gMCAmJiBzbGFuZy0+c2xfc2J5dHMgIT0gTlVMTCkKKwl7CisJICAgIC8qIEZyZWUgdGhlIGluZm8gYWJvdXQgaGFuZGxlZCB3b3Jkcy4gKi8KKwkgICAgdG9kbyA9IHNsYW5nLT5zbF9zb3VuZGRvbmUuaHRfdXNlZDsKKwkgICAgZm9yIChoaSA9IHNsYW5nLT5zbF9zb3VuZGRvbmUuaHRfYXJyYXk7IHRvZG8gPiAwOyArK2hpKQorCQlpZiAoIUhBU0hJVEVNX0VNUFRZKGhpKSkKIAkJewotCQkgICAgYnl0cyA9IHNsYW5nLT5zbF9mYnl0czsKLQkJICAgIGlkeHMgPSBzbGFuZy0+c2xfZmlkeHM7CisJCSAgICB2aW1fZnJlZShISTJTRlQoaGkpKTsKKwkJICAgIC0tdG9kbzsKKwkJfQorCSAgICBoYXNoX2NsZWFyKCZzbGFuZy0+c2xfc291bmRkb25lKTsKKwl9CisgICAgfQorfQorCisvKgorICogQSBtYXRjaCB3aXRoIGEgc291bmRmb2xkZWQgd29yZCBpcyBmb3VuZC4gIEFkZCB0aGUgZ29vZCB3b3JkKHMpIHRoYXQKKyAqIHByb2R1Y2UgdGhpcyBzb3VuZGZvbGRlZCB3b3JkLgorICovCisgICAgc3RhdGljIHZvaWQKK2FkZF9zb3VuZF9zdWdnZXN0KHN1LCBnb29kd29yZCwgc2NvcmUsIGxwKQorICAgIHN1Z2luZm9fVAkqc3U7CisgICAgY2hhcl91CSpnb29kd29yZDsKKyAgICBpbnQJCXNjb3JlOwkJLyogc291bmRmb2xkIHNjb3JlICAqLworICAgIGxhbmdwX1QJKmxwOworeworICAgIHNsYW5nX1QJKnNsYW5nID0gbHAtPmxwX3NsYW5nOwkvKiBsYW5ndWFnZSBmb3Igc291bmQgZm9sZGluZyAqLworICAgIGludAkJc2Z3b3JkbnI7CisgICAgY2hhcl91CSpucmxpbmU7CisgICAgaW50CQlvcmducjsKKyAgICBjaGFyX3UJdGhld29yZFtNQVhXTEVOXTsKKyAgICBpbnQJCWk7CisgICAgaW50CQl3bGVuOworICAgIGNoYXJfdQkqYnl0czsKKyAgICBpZHhfVAkqaWR4czsKKyAgICBpbnQJCW47CisgICAgaW50CQl3b3JkY291bnQ7CisgICAgaW50CQl3YzsKKyAgICBpbnQJCWdvb2RzY29yZTsKKyAgICBoYXNoX1QJaGFzaDsKKyAgICBoYXNoaXRlbV9UICAqaGk7CisgICAgc2Z0d29yZF9UCSpzZnQ7CisgICAgaW50CQliYywgZ2M7CisgICAgaW50CQlsaW1pdDsKKworICAgIC8qCisgICAgICogSXQncyB2ZXJ5IHdlbGwgcG9zc2libGUgdGhhdCB0aGUgc2FtZSBzb3VuZGZvbGQgd29yZCBpcyBmb3VuZCBzZXZlcmFsCisgICAgICogdGltZXMgd2l0aCBkaWZmZXJlbnQgc2NvcmVzLiAgU2luY2UgdGhlIGZvbGxvd2luZyBpcyBxdWl0ZSBzbG93IG9ubHkgZG8KKyAgICAgKiB0aGUgd29yZHMgdGhhdCBoYXZlIGEgYmV0dGVyIHNjb3JlIHRoYW4gYmVmb3JlLiAgVXNlIGEgaGFzaHRhYmxlIHRvCisgICAgICogcmVtZW1iZXIgdGhlIHdvcmRzIHRoYXQgaGF2ZSBiZWVuIGRvbmUuCisgICAgICovCisgICAgaGFzaCA9IGhhc2hfaGFzaChnb29kd29yZCk7CisgICAgaGkgPSBoYXNoX2xvb2t1cCgmc2xhbmctPnNsX3NvdW5kZG9uZSwgZ29vZHdvcmQsIGhhc2gpOworICAgIGlmIChIQVNISVRFTV9FTVBUWShoaSkpCisgICAgeworCXNmdCA9IChzZnR3b3JkX1QgKilhbGxvYyhzaXplb2Yoc2Z0d29yZF9UKSArIFNUUkxFTihnb29kd29yZCkpOworCWlmIChzZnQgIT0gTlVMTCkKKwl7CisJICAgIHNmdC0+c2Z0X3Njb3JlID0gc2NvcmU7CisJICAgIFNUUkNQWShzZnQtPnNmdF93b3JkLCBnb29kd29yZCk7CisJICAgIGhhc2hfYWRkX2l0ZW0oJnNsYW5nLT5zbF9zb3VuZGRvbmUsIGhpLCBzZnQtPnNmdF93b3JkLCBoYXNoKTsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJc2Z0ID0gSEkyU0ZUKGhpKTsKKwlpZiAoc2NvcmUgPj0gc2Z0LT5zZnRfc2NvcmUpCisJICAgIHJldHVybjsKKwlzZnQtPnNmdF9zY29yZSA9IHNjb3JlOworICAgIH0KKworICAgIC8qCisgICAgICogRmluZCB0aGUgd29yZCBuciBpbiB0aGUgc291bmRmb2xkIHRyZWUuCisgICAgICovCisgICAgc2Z3b3JkbnIgPSBzb3VuZGZvbGRfZmluZChzbGFuZywgZ29vZHdvcmQpOworICAgIGlmIChzZndvcmRuciA8IDApCisgICAgeworCUVNU0cyKF8oZV9pbnRlcm4yKSwgImFkZF9zb3VuZF9zdWdnZXN0KCkiKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBnbyBvdmVyIHRoZSBsaXN0IG9mIGdvb2Qgd29yZHMgdGhhdCBwcm9kdWNlIHRoaXMgc291bmRmb2xkIHdvcmQKKyAgICAgKi8KKyAgICBucmxpbmUgPSBtbF9nZXRfYnVmKHNsYW5nLT5zbF9zdWdidWYsIChsaW5lbnJfVCkoc2Z3b3JkbnIgKyAxKSwgRkFMU0UpOworICAgIG9yZ25yID0gMDsKKyAgICB3aGlsZSAoKm5ybGluZSAhPSBOVUwpCisgICAgeworCS8qIFRoZSB3b3JkbnIgd2FzIHN0b3JlZCBpbiBhIG1pbmltYWwgbnIgb2YgYnl0ZXMgYXMgYW4gb2Zmc2V0IHRvIHRoZQorCSAqIHByZXZpb3VzIHdvcmRuci4gKi8KKwlvcmduciArPSBieXRlczJvZmZzZXQoJm5ybGluZSk7CisKKwlieXRzID0gc2xhbmctPnNsX2ZieXRzOworCWlkeHMgPSBzbGFuZy0+c2xfZmlkeHM7CisKKwkvKiBMb29rdXAgdGhlIHdvcmQgIm9yZ25yIiBvbmUgb2YgdGhlIHR3byB0cmllcy4gKi8KKwluID0gMDsKKwl3bGVuID0gMDsKKwl3b3JkY291bnQgPSAwOworCWZvciAoOzspCisJeworCSAgICBpID0gMTsKKwkgICAgaWYgKHdvcmRjb3VudCA9PSBvcmduciAmJiBieXRzW24gKyAxXSA9PSBOVUwpCisJCWJyZWFrOwkvKiBmb3VuZCBlbmQgb2Ygd29yZCAqLworCisJICAgIGlmIChieXRzW24gKyAxXSA9PSBOVUwpCisJCSsrd29yZGNvdW50OworCisJICAgIC8qIHNraXAgb3ZlciB0aGUgTlVMIGJ5dGVzICovCisJICAgIGZvciAoIDsgYnl0c1tuICsgaV0gPT0gTlVMOyArK2kpCisJCWlmIChpID4gYnl0c1tuXSkJLyogc2FmZXR5IGNoZWNrICovCisJCXsKKwkJICAgIFNUUkNQWSh0aGV3b3JkICsgd2xlbiwgIkJBRCIpOworCQkgICAgZ290byBiYWR3b3JkOworCQl9CisKKwkgICAgLyogT25lIG9mIHRoZSBzaWJsaW5ncyBtdXN0IGhhdmUgdGhlIHdvcmQuICovCisJICAgIGZvciAoIDsgaSA8IGJ5dHNbbl07ICsraSkKKwkgICAgeworCQl3YyA9IGlkeHNbaWR4c1tuICsgaV1dOwkvKiBuciBvZiB3b3JkcyB1bmRlciB0aGlzIGJ5dGUgKi8KKwkJaWYgKHdvcmRjb3VudCArIHdjID4gb3JnbnIpCisJCSAgICBicmVhazsKKwkJd29yZGNvdW50ICs9IHdjOworCSAgICB9CisKKwkgICAgdGhld29yZFt3bGVuKytdID0gYnl0c1tuICsgaV07CisJICAgIG4gPSBpZHhzW24gKyBpXTsKKwl9CitiYWR3b3JkOgorCXRoZXdvcmRbd2xlbl0gPSBOVUw7CisKKwkvKiBHbyBvdmVyIHRoZSBwb3NzaWJsZSBmbGFncyBhbmQgcmVnaW9ucy4gKi8KKwlmb3IgKDsgaSA8PSBieXRzW25dICYmIGJ5dHNbbiArIGldID09IE5VTDsgKytpKQorCXsKKwkgICAgY2hhcl91CWN3b3JkW01BWFdMRU5dOworCSAgICBjaGFyX3UJKnA7CisJICAgIGludAkJZmxhZ3MgPSAoaW50KWlkeHNbbiArIGldOworCisJICAgIGlmIChmbGFncyAmIFdGX0tFRVBDQVApCisJICAgIHsKKwkJLyogTXVzdCBmaW5kIHRoZSB3b3JkIGluIHRoZSBrZWVwLWNhc2UgdHJlZS4gKi8KKwkJZmluZF9rZWVwY2FwX3dvcmQoc2xhbmcsIHRoZXdvcmQsIGN3b3JkKTsKKwkJcCA9IGN3b3JkOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlmbGFncyB8PSBzdS0+c3VfYmFkZmxhZ3M7CisJCWlmICgoZmxhZ3MgJiBXRl9DQVBNQVNLKSAhPSAwKQorCQl7CisJCSAgICAvKiBOZWVkIHRvIGZpeCBjYXNlIGFjY29yZGluZyB0byAiZmxhZ3MiLiAqLworCQkgICAgbWFrZV9jYXNlX3dvcmQodGhld29yZCwgY3dvcmQsIGZsYWdzKTsKKwkJICAgIHAgPSBjd29yZDsKIAkJfQogCQllbHNlCisJCSAgICBwID0gdGhld29yZDsKKwkgICAgfQorCisJICAgIC8qIEFkZCB0aGUgc3VnZ2VzdGlvbi4gKi8KKwkgICAgaWYgKHNwc19mbGFncyAmIFNQU19ET1VCTEUpCisJICAgIHsKKwkJLyogQWRkIHRoZSBzdWdnZXN0aW9uIGlmIHRoZSBzY29yZSBpc24ndCB0b28gYmFkLiAqLworCQlpZiAoc2NvcmUgPD0gc3UtPnN1X21heHNjb3JlKQorCQkgICAgYWRkX3N1Z2dlc3Rpb24oc3UsICZzdS0+c3Vfc2dhLCBwLCBzdS0+c3VfYmFkbGVuLAorCQkJCQkgICAgICAgc2NvcmUsIDAsIEZBTFNFLCBzbGFuZywgRkFMU0UpOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQkvKiBBZGQgYSBwZW5hbHR5IGZvciB3b3JkcyBpbiBhbm90aGVyIHJlZ2lvbi4gKi8KKwkJaWYgKChmbGFncyAmIFdGX1JFR0lPTikKKwkJCSAgICAmJiAoKCh1bnNpZ25lZClmbGFncyA+PiAxNikgJiBscC0+bHBfcmVnaW9uKSA9PSAwKQorCQkgICAgZ29vZHNjb3JlID0gU0NPUkVfUkVHSU9OOworCQllbHNlCisJCSAgICBnb29kc2NvcmUgPSAwOworCisJCS8qIEFkZCBhIHNtYWxsIHBlbmFsdHkgZm9yIGNoYW5naW5nIHRoZSBmaXJzdCBsZXR0ZXIgZnJvbQorCQkgKiBsb3dlciB0byB1cHBlciBjYXNlLiAgSGVscHMgZm9yICJ0YXRoIiAtPiAiS2F0aCIsIHdoaWNoIGlzCisJCSAqIGxlc3MgY29tbW9uIHRoYXRuICJ0YXRoIiAtPiAicGF0aCIuICBEb24ndCBkbyBpdCB3aGVuIHRoZQorCQkgKiBsZXR0ZXIgaXMgdGhlIHNhbWUsIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjb3VudGVkLiAqLworCQlnYyA9IFBUUjJDSEFSKHApOworCQlpZiAoU1BFTExfSVNVUFBFUihnYykpCiAJCXsKLQkJICAgIGJ5dHMgPSBzbGFuZy0+c2xfa2J5dHM7Ci0JCSAgICBpZHhzID0gc2xhbmctPnNsX2tpZHhzOwotCQkgICAgaWYgKGJ5dHMgPT0gTlVMTCkJICAgIC8qIG5vIGtlZXAtY2FzZSB3b3JkcyAqLwotCQkJY29udGludWU7CisJCSAgICBiYyA9IFBUUjJDSEFSKHN1LT5zdV9iYWR3b3JkKTsKKwkJICAgIGlmICghU1BFTExfSVNVUFBFUihiYykKKwkJCQkgICAgICAmJiBTUEVMTF9UT0ZPTEQoYmMpICE9IFNQRUxMX1RPRk9MRChnYykpCisJCQlnb29kc2NvcmUgKz0gU0NPUkVfSUNBU0UgLyAyOwogCQl9CiAKLQkJZGVwdGggPSAwOwotCQlhcnJpZHhbMF0gPSAwOwotCQljdXJpWzBdID0gMTsKLQkJd2hpbGUgKGRlcHRoID49IDAgJiYgIWdvdF9pbnQpCisJCS8qIENvbXB1dGUgdGhlIHNjb3JlIGZvciB0aGUgZ29vZCB3b3JkLiAgVGhpcyBvbmx5IGRvZXMgbGV0dGVyCisJCSAqIGluc2VydC9kZWxldGUvc3dhcC9yZXBsYWNlLiAgUkVQIGl0ZW1zIGFyZSBub3QgY29uc2lkZXJlZCwKKwkJICogd2hpY2ggbWF5IG1ha2UgdGhlIHNjb3JlIGEgYml0IGhpZ2hlci4KKwkJICogVXNlIGEgbGltaXQgZm9yIHRoZSBzY29yZSB0byBtYWtlIGl0IHdvcmsgZmFzdGVyLiAgVXNlCisJCSAqIE1BWFNDT1JFKCksIGJlY2F1c2UgUkVTQ09SRSgpIHdpbGwgY2hhbmdlIHRoZSBzY29yZS4KKwkJICogSWYgdGhlIGxpbWl0IGlzIHZlcnkgaGlnaCB0aGVuIHRoZSBpdGVyYXRpdmUgbWV0aG9kIGlzCisJCSAqIGluZWZmaWNpZW50LCB1c2luZyBhbiBhcnJheSBpcyBxdWlja2VyLiAqLworCQlsaW1pdCA9IE1BWFNDT1JFKHN1LT5zdV9zZm1heHNjb3JlIC0gZ29vZHNjb3JlLCBzY29yZSk7CisJCWlmIChsaW1pdCA+IFNDT1JFX0xJTUlUTUFYKQorCQkgICAgZ29vZHNjb3JlICs9IHNwZWxsX2VkaXRfc2NvcmUoc2xhbmcsIHN1LT5zdV9iYWR3b3JkLCBwKTsKKwkJZWxzZQorCQkgICAgZ29vZHNjb3JlICs9IHNwZWxsX2VkaXRfc2NvcmVfbGltaXQoc2xhbmcsIHN1LT5zdV9iYWR3b3JkLAorCQkJCQkJCQkgICAgcCwgbGltaXQpOworCisJCS8qIFdoZW4gZ29pbmcgb3ZlciB0aGUgbGltaXQgZG9uJ3QgYm90aGVyIHRvIGRvIHRoZSByZXN0LiAqLworCQlpZiAoZ29vZHNjb3JlIDwgU0NPUkVfTUFYTUFYKQogCQl7Ci0JCSAgICBpZiAoY3VyaVtkZXB0aF0gPiBieXRzW2FycmlkeFtkZXB0aF1dKQotCQkgICAgewotCQkJLyogRG9uZSBhbGwgYnl0ZXMgYXQgdGhpcyBub2RlLCBnbyB1cCBvbmUgbGV2ZWwuICovCi0JCQktLWRlcHRoOwotCQkJbGluZV9icmVha2NoZWNrKCk7Ci0JCSAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICB7Ci0JCQkvKiBEbyBvbmUgbW9yZSBieXRlIGF0IHRoaXMgbm9kZS4gKi8KLQkJCW4gPSBhcnJpZHhbZGVwdGhdICsgY3VyaVtkZXB0aF07Ci0JCQkrK2N1cmlbZGVwdGhdOwotCQkJYyA9IGJ5dHNbbl07Ci0JCQlpZiAoYyA9PSAwKQotCQkJewotCQkJICAgIC8qIEVuZCBvZiB3b3JkLCBkZWFsIHdpdGggdGhlIHdvcmQuICovCi0JCQkgICAgZmxhZ3MgPSAoaW50KWlkeHNbbl07Ci0JCQkgICAgaWYgKHJvdW5kID09IDIgfHwgKGZsYWdzICYgV0ZfS0VFUENBUCkgPT0gMCkKLQkJCSAgICB7Ci0JCQkJdHdvcmRbZGVwdGhdID0gTlVMOwotCQkJCS8qIFNvdW5kLWZvbGQuICBPbmx5IGluIGtlZXAtY2FzZSB0cmVlIG5lZWQgdG8KLQkJCQkgKiBjYXNlLWZvbGQgdGhlIHdvcmQuICovCi0JCQkJc3BlbGxfc291bmRmb2xkKHNsYW5nLCB0d29yZCwKLQkJCQkJCQlyb3VuZCA9PSAxLCB0c2Fsd29yZCk7CisJCSAgICAvKiBHaXZlIGEgYm9udXMgdG8gd29yZHMgc2VlbiBiZWZvcmUuICovCisJCSAgICBnb29kc2NvcmUgPSBzY29yZV93b3JkY291bnRfYWRqKHNsYW5nLCBnb29kc2NvcmUsIHAsIEZBTFNFKTsKIAotCQkJCS8qIENvbXB1dGUgdGhlIGVkaXQgZGlzdGFuY2UgYmV0d2VlbiB0aGUKLQkJCQkgKiBzb3VuZC1hLWxpa2Ugd29yZHMuICovCi0JCQkJc291bmRfc2NvcmUgPSBzb3VuZGFsaWtlX3Njb3JlKHNhbHdvcmQsCi0JCQkJCQkJCSAgICB0c2Fsd29yZCk7Ci0KLQkJCQkvKiBBZGQgYSBwZW5hbHR5IGZvciB3b3JkcyBpbiBhbm90aGVyIHJlZ2lvbi4gKi8KLQkJCQlpZiAoKGZsYWdzICYgV0ZfUkVHSU9OKSAmJiAoKCh1bnNpZ25lZClmbGFncwotCQkJCQkJID4+IDE2KSAmIGxwLT5scF9yZWdpb24pID09IDApCi0JCQkJICAgIGxvY2FsX3Njb3JlID0gU0NPUkVfUkVHSU9OOwotCQkJCWVsc2UKLQkJCQkgICAgbG9jYWxfc2NvcmUgPSAwOwotCQkJCXNvdW5kX3Njb3JlICs9IGxvY2FsX3Njb3JlOwotCi0JCQkJaWYgKHNvdW5kX3Njb3JlIDwgU0NPUkVfTUFYTUFYKQotCQkJCXsKLQkJCQkgICAgY2hhcl91CWN3b3JkW01BWFdMRU5dOwotCQkJCSAgICBjaGFyX3UJKnA7Ci0JCQkJICAgIGludAkJc2NvcmU7Ci0KLQkJCQkgICAgZmxhZ3MgfD0gc3UtPnN1X2JhZGZsYWdzOwotCQkJCSAgICBpZiAocm91bmQgPT0gMSAmJiAoZmxhZ3MgJiBXRl9DQVBNQVNLKSAhPSAwKQotCQkJCSAgICB7Ci0JCQkJCS8qIE5lZWQgdG8gZml4IGNhc2UgYWNjb3JkaW5nIHRvCi0JCQkJCSAqICJmbGFncyIuICovCi0JCQkJCW1ha2VfY2FzZV93b3JkKHR3b3JkLCBjd29yZCwgZmxhZ3MpOwotCQkJCQlwID0gY3dvcmQ7Ci0JCQkJICAgIH0KLQkJCQkgICAgZWxzZQotCQkJCQlwID0gdHdvcmQ7Ci0KLQkJCQkgICAgaWYgKHNwc19mbGFncyAmIFNQU19ET1VCTEUpCi0JCQkJCWFkZF9zdWdnZXN0aW9uKHN1LCAmc3UtPnN1X3NnYSwgcCwKLQkJCQkJCXN1LT5zdV9iYWRsZW4sCi0JCQkJCQlzb3VuZF9zY29yZSwgMCwgRkFMU0UsCi0JCQkJCQlscC0+bHBfc2FsbGFuZyk7Ci0JCQkJICAgIGVsc2UKLQkJCQkgICAgewotCQkJCQkvKiBDb21wdXRlIHRoZSBzY29yZS4gKi8KLQkJCQkJc2NvcmUgPSBzcGVsbF9lZGl0X3Njb3JlKAotCQkJCQkJCSAgIHN1LT5zdV9iYWR3b3JkLCBwKQotCQkJCQkJICAgICsgbG9jYWxfc2NvcmU7Ci0JCQkJCWlmIChzcHNfZmxhZ3MgJiBTUFNfQkVTVCkKLQkJCQkJICAgIC8qIGdpdmUgYSBib251cyBmb3IgdGhlIGdvb2Qgd29yZAotCQkJCQkgICAgICogc291bmRpbmcgdGhlIHNhbWUgYXMgdGhlIGJhZAotCQkJCQkgICAgICogd29yZCAqLwotCQkJCQkgICAgYWRkX3N1Z2dlc3Rpb24oc3UsICZzdS0+c3VfZ2EsIHAsCi0JCQkJCQkgICAgc3UtPnN1X2JhZGxlbiwKLQkJCQkJCSAgUkVTQ09SRShzY29yZSwgc291bmRfc2NvcmUpLAotCQkJCQkJICAgIHNvdW5kX3Njb3JlLCBUUlVFLAotCQkJCQkJICAgIGxwLT5scF9zYWxsYW5nKTsKLQkJCQkJZWxzZQotCQkJCQkgICAgYWRkX3N1Z2dlc3Rpb24oc3UsICZzdS0+c3VfZ2EsIHAsCi0JCQkJCQkgICAgc3UtPnN1X2JhZGxlbiwKLQkJCQkJCSAgICBzY29yZSArIHNvdW5kX3Njb3JlLAotCQkJCQkJICAgIDAsIEZBTFNFLAotCQkJCQkJICAgIGxwLT5scF9zYWxsYW5nKTsKLQkJCQkgICAgfQotCQkJCX0KLQkJCSAgICB9Ci0KLQkJCSAgICAvKiBTa2lwIG92ZXIgb3RoZXIgTlVMIGJ5dGVzLiAqLwotCQkJICAgIHdoaWxlIChieXRzW24gKyAxXSA9PSAwKQotCQkJICAgIHsKLQkJCQkrK247Ci0JCQkJKytjdXJpW2RlcHRoXTsKLQkJCSAgICB9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkgICAgLyogTm9ybWFsIGNoYXIsIGdvIG9uZSBsZXZlbCBkZWVwZXIuICovCi0JCQkgICAgdHdvcmRbZGVwdGgrK10gPSBjOwotCQkJICAgIGFycmlkeFtkZXB0aF0gPSBpZHhzW25dOwotCQkJICAgIGN1cmlbZGVwdGhdID0gMTsKLQkJCX0KLQkJICAgIH0KKwkJICAgIC8qIEFkZCB0aGUgc3VnZ2VzdGlvbiBpZiB0aGUgc2NvcmUgaXNuJ3QgdG9vIGJhZC4gKi8KKwkJICAgIGdvb2RzY29yZSA9IFJFU0NPUkUoZ29vZHNjb3JlLCBzY29yZSk7CisJCSAgICBpZiAoZ29vZHNjb3JlIDw9IHN1LT5zdV9zZm1heHNjb3JlKQorCQkJYWRkX3N1Z2dlc3Rpb24oc3UsICZzdS0+c3VfZ2EsIHAsIHN1LT5zdV9iYWRsZW4sCisJCQkJCSBnb29kc2NvcmUsIHNjb3JlLCBUUlVFLCBzbGFuZywgVFJVRSk7CiAJCX0KIAkgICAgfQogCX0KKwkvKiBzbXNnKCJ3b3JkICVzICglZCk6ICVzICglZCkiLCBzZnR3b3JkLCBzZnRuciwgdGhld29yZCwgb3JnbnIpOyAqLwogICAgIH0KIH0KIAogLyoKKyAqIEZpbmQgd29yZCAid29yZCIgaW4gZm9sZC1jYXNlIHRyZWUgZm9yICJzbGFuZyIgYW5kIHJldHVybiB0aGUgd29yZCBudW1iZXIuCisgKi8KKyAgICBzdGF0aWMgaW50Citzb3VuZGZvbGRfZmluZChzbGFuZywgd29yZCkKKyAgICBzbGFuZ19UCSpzbGFuZzsKKyAgICBjaGFyX3UJKndvcmQ7Cit7CisgICAgaWR4X1QJYXJyaWR4ID0gMDsKKyAgICBpbnQJCWxlbjsKKyAgICBpbnQJCXdsZW4gPSAwOworICAgIGludAkJYzsKKyAgICBjaGFyX3UJKnB0ciA9IHdvcmQ7CisgICAgY2hhcl91CSpieXRzOworICAgIGlkeF9UCSppZHhzOworICAgIGludAkJd29yZG5yID0gMDsKKworICAgIGJ5dHMgPSBzbGFuZy0+c2xfc2J5dHM7CisgICAgaWR4cyA9IHNsYW5nLT5zbF9zaWR4czsKKworICAgIGZvciAoOzspCisgICAgeworCS8qIEZpcnN0IGJ5dGUgaXMgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBieXRlcy4gKi8KKwlsZW4gPSBieXRzW2FycmlkeCsrXTsKKworCS8qIElmIHRoZSBmaXJzdCBwb3NzaWJsZSBieXRlIGlzIGEgemVybyB0aGUgd29yZCBjb3VsZCBlbmQgaGVyZS4KKwkgKiBJZiB0aGUgd29yZCBlbmRzIHdlIGZvdW5kIHRoZSB3b3JkLiAgSWYgbm90IHNraXAgdGhlIE5VTCBieXRlcy4gKi8KKwljID0gcHRyW3dsZW5dOworCWlmIChieXRzW2FycmlkeF0gPT0gTlVMKQorCXsKKwkgICAgaWYgKGMgPT0gTlVMKQorCQlicmVhazsKKworCSAgICAvKiBTa2lwIG92ZXIgdGhlIHplcm9zLCB0aGVyZSBjYW4gYmUgc2V2ZXJhbC4gKi8KKwkgICAgd2hpbGUgKGxlbiA+IDAgJiYgYnl0c1thcnJpZHhdID09IE5VTCkKKwkgICAgeworCQkrK2FycmlkeDsKKwkJLS1sZW47CisJICAgIH0KKwkgICAgaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gLTE7ICAgIC8qIG5vIGNoaWxkcmVuLCB3b3JkIHNob3VsZCBoYXZlIGVuZGVkIGhlcmUgKi8KKwkgICAgKyt3b3JkbnI7CisJfQorCisJLyogSWYgdGhlIHdvcmQgZW5kcyB3ZSBkaWRuJ3QgZmluZCBpdC4gKi8KKwlpZiAoYyA9PSBOVUwpCisJICAgIHJldHVybiAtMTsKKworCS8qIFBlcmZvcm0gYSBiaW5hcnkgc2VhcmNoIGluIHRoZSBsaXN0IG9mIGFjY2VwdGVkIGJ5dGVzLiAqLworCWlmIChjID09IFRBQikJICAgIC8qIDxUYWI+IGlzIGhhbmRsZWQgbGlrZSA8U3BhY2U+ICovCisJICAgIGMgPSAnICc7CisJd2hpbGUgKGJ5dHNbYXJyaWR4XSA8IGMpCisJeworCSAgICAvKiBUaGUgd29yZCBjb3VudCBpcyBpbiB0aGUgZmlyc3QgaWR4c1tdIGVudHJ5IG9mIHRoZSBjaGlsZC4gKi8KKwkgICAgd29yZG5yICs9IGlkeHNbaWR4c1thcnJpZHhdXTsKKwkgICAgKythcnJpZHg7CisJICAgIGlmICgtLWxlbiA9PSAwKQkvKiBlbmQgb2YgdGhlIGJ5dGVzLCBkaWRuJ3QgZmluZCBpdCAqLworCQlyZXR1cm4gLTE7CisJfQorCWlmIChieXRzW2FycmlkeF0gIT0gYykJLyogZGlkbid0IGZpbmQgdGhlIGJ5dGUgKi8KKwkgICAgcmV0dXJuIC0xOworCisJLyogQ29udGludWUgYXQgdGhlIGNoaWxkIChpZiB0aGVyZSBpcyBvbmUpLiAqLworCWFycmlkeCA9IGlkeHNbYXJyaWR4XTsKKwkrK3dsZW47CisKKwkvKiBPbmUgc3BhY2UgaW4gdGhlIGdvb2Qgd29yZCBtYXkgc3RhbmQgZm9yIHNldmVyYWwgc3BhY2VzIGluIHRoZQorCSAqIGNoZWNrZWQgd29yZC4gKi8KKwlpZiAoYyA9PSAnICcpCisJICAgIHdoaWxlIChwdHJbd2xlbl0gPT0gJyAnIHx8IHB0clt3bGVuXSA9PSBUQUIpCisJCSsrd2xlbjsKKyAgICB9CisKKyAgICByZXR1cm4gd29yZG5yOworfQorCisvKgogICogQ29weSAiZndvcmQiIHRvICJjd29yZCIsIGZpeGluZyBjYXNlIGFjY29yZGluZyB0byAiZmxhZ3MiLgogICovCiAgICAgc3RhdGljIHZvaWQKQEAgLTExMDkwLDcgKzEyNzMzLDcgQEAKICAgICB9CiAgICAgbHAtPnNsX2hhc19tYXAgPSBUUlVFOwogCi0gICAgLyogSW5pdCB0aGUgYXJyYXkgYW5kIGhhc2ggdGFibGUgZW1wdHkuICovCisgICAgLyogSW5pdCB0aGUgYXJyYXkgYW5kIGhhc2ggdGFibGVzIGVtcHR5LiAqLwogICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkKIAlscC0+c2xfbWFwX2FycmF5W2ldID0gMDsKICNpZmRlZiBGRUFUX01CWVRFCkBAIC0xMTIwNCw0NSArMTI4NDcsMzkgQEAKIAogLyoKICAqIEFkZCBhIHN1Z2dlc3Rpb24gdG8gdGhlIGxpc3Qgb2Ygc3VnZ2VzdGlvbnMuCi0gKiBEbyBub3QgYWRkIGEgZHVwbGljYXRlIHN1Z2dlc3Rpb24gb3Igc3VnZ2VzdGlvbnMgd2l0aCBhIGJhZCBzY29yZS4KLSAqIFdoZW4gInVzZV9zY29yZSIgaXMgbm90IHplcm8gaXQncyB1c2VkLCBvdGhlcndpc2UgdGhlIHNjb3JlIGlzIGNvbXB1dGVkCi0gKiB3aXRoIHNwZWxsX2VkaXRfc2NvcmUoKS4KKyAqIEZvciBhIHN1Z2dlc3Rpb24gdGhhdCBpcyBhbHJlYWR5IGluIHRoZSBsaXN0IHRoZSBsb3dlc3Qgc2NvcmUgaXMgcmVtZW1iZXJlZC4KICAqLwogICAgIHN0YXRpYyB2b2lkCi1hZGRfc3VnZ2VzdGlvbihzdSwgZ2FwLCBnb29kd29yZCwgYmFkbGVuYXJnLCBzY29yZSwgYWx0c2NvcmUsIGhhZF9ib251cywgc2xhbmcpCithZGRfc3VnZ2VzdGlvbihzdSwgZ2FwLCBnb29kd29yZCwgYmFkbGVuYXJnLCBzY29yZSwgYWx0c2NvcmUsIGhhZF9ib251cywKKwkJCQkJCQkJIHNsYW5nLCBtYXhzZikKICAgICBzdWdpbmZvX1QJKnN1OwotICAgIGdhcnJheV9UCSpnYXA7CisgICAgZ2FycmF5X1QJKmdhcDsJCS8qIGVpdGhlciBzdV9nYSBvciBzdV9zZ2EgKi8KICAgICBjaGFyX3UJKmdvb2R3b3JkOwogICAgIGludAkJYmFkbGVuYXJnOwkvKiBsZW4gb2YgYmFkIHdvcmQgcmVwbGFjZWQgd2l0aCAiZ29vZHdvcmQiICovCiAgICAgaW50CQlzY29yZTsKICAgICBpbnQJCWFsdHNjb3JlOwogICAgIGludAkJaGFkX2JvbnVzOwkvKiB2YWx1ZSBmb3Igc3RfaGFkX2JvbnVzICovCiAgICAgc2xhbmdfVAkqc2xhbmc7CQkvKiBsYW5ndWFnZSBmb3Igc291bmQgZm9sZGluZyAqLworICAgIGludAkJbWF4c2Y7CQkvKiBzdV9tYXhzY29yZSBhcHBsaWVzIHRvIHNvdW5kZm9sZCBzY29yZSwKKwkJCQkgICBzdV9zZm1heHNjb3JlIHRvIHRoZSB0b3RhbCBzY29yZS4gKi8KIHsKLSAgICBpbnQJCWdvb2RsZW4gPSBTVFJMRU4oZ29vZHdvcmQpOyAvKiBsZW4gb2YgZ29vZHdvcmQgY2hhbmdlZCAqLwotICAgIGludAkJYmFkbGVuID0gYmFkbGVuYXJnOwkgICAgLyogbGVuIG9mIGJhZCB3b3JkIGNoYW5nZWQgKi8KKyAgICBpbnQJCWdvb2RsZW47CS8qIGxlbiBvZiBnb29kd29yZCBjaGFuZ2VkICovCisgICAgaW50CQliYWRsZW47CQkvKiBsZW4gb2YgYmFkIHdvcmQgY2hhbmdlZCAqLwogICAgIHN1Z2dlc3RfVCAgICpzdHA7CiAgICAgc3VnZ2VzdF9UICAgbmV3X3N1ZzsKICAgICBpbnQJCWk7Ci0gICAgaGxmX1QJYXR0ciA9IEhMRl9DT1VOVDsKLSAgICBjaGFyX3UJbG9uZ3dvcmRbTUFYV0xFTiArIDFdOwogICAgIGNoYXJfdQkqcGdvb2QsICpwYmFkOwogCi0gICAgLyogQ2hlY2sgdGhhdCB0aGUgd29yZCByZWFsbHkgaXMgdmFsaWQuICBFc3AuIGZvciBiYW5uZWQgd29yZHMgYW5kIGZvcgotICAgICAqIHNwbGl0IHdvcmRzLCBzdWNoIGFzICJ0aGUgdGhlIi4gIE5lZWQgdG8gYXBwZW5kIHdoYXQgZm9sbG93cyB0byBjaGVjawotICAgICAqIGZvciB0aGF0LiAqLwotICAgIFNUUkNQWShsb25nd29yZCwgZ29vZHdvcmQpOwotICAgIHZpbV9zdHJuY3B5KGxvbmd3b3JkICsgZ29vZGxlbiwgc3UtPnN1X2JhZHB0ciArIGJhZGxlbiwgTUFYV0xFTiAtIGdvb2RsZW4pOwotICAgICh2b2lkKXNwZWxsX2NoZWNrKGN1cndpbiwgbG9uZ3dvcmQsICZhdHRyLCBOVUxMKTsKLSAgICBpZiAoYXR0ciAhPSBITEZfQ09VTlQpCi0JcmV0dXJuOwotCiAgICAgLyogTWluaW1pemUgImJhZGxlbiIgZm9yIGNvbnNpc3RlbmN5LiAgQXZvaWRzIHRoYXQgY2hhbmdpbmcgInRoZSB0aGUiIHRvCiAgICAgICogInRoZWUgdGhlIiBpcyBhZGRlZCBuZXh0IHRvIGNoYW5naW5nIHRoZSBmaXJzdCAidGhlIiB0aGUgInRoZWUiLiAgKi8KICAgICBwZ29vZCA9IGdvb2R3b3JkICsgU1RSTEVOKGdvb2R3b3JkKTsKLSAgICBwYmFkID0gc3UtPnN1X2JhZHB0ciArIGJhZGxlbjsKLSAgICB3aGlsZSAocGdvb2QgPiBnb29kd29yZCAmJiBwYmFkID4gc3UtPnN1X2JhZHB0cikKKyAgICBwYmFkID0gc3UtPnN1X2JhZHB0ciArIGJhZGxlbmFyZzsKKyAgICBmb3IgKDs7KQogICAgIHsKKwlnb29kbGVuID0gcGdvb2QgLSBnb29kd29yZDsKKwliYWRsZW4gPSBwYmFkIC0gc3UtPnN1X2JhZHB0cjsKKwlpZiAoZ29vZGxlbiA8PSAwIHx8IGJhZGxlbiA8PSAwKQorCSAgICBicmVhazsKIAltYl9wdHJfYmFjayhnb29kd29yZCwgcGdvb2QpOwogCW1iX3B0cl9iYWNrKHN1LT5zdV9iYWRwdHIsIHBiYWQpOwogI2lmZGVmIEZFQVRfTUJZVEUKQEAgLTExMjU1LDg4ICsxMjg5MiwxMzMgQEAKICNlbmRpZgogCSAgICBpZiAoKnBnb29kICE9ICpwYmFkKQogCQlicmVhazsKLQliYWRsZW4gPSBwYmFkIC0gc3UtPnN1X2JhZHB0cjsKLQlnb29kbGVuID0gcGdvb2QgLSBnb29kd29yZDsKICAgICB9CisKICAgICBpZiAoYmFkbGVuID09IDAgJiYgZ29vZGxlbiA9PSAwKQogCS8qIGdvb2R3b3JkIGRvZXNuJ3QgY2hhbmdlIGFueXRoaW5nOyBtYXkgaGFwcGVuIGZvciAidGhlIHRoZSIgY2hhbmdpbmcKIAkgKiB0aGUgZmlyc3QgInRoZSIgdG8gaXRzZWxmLiAqLwogCXJldHVybjsKIAotICAgIGlmIChzY29yZSA8PSBzdS0+c3VfbWF4c2NvcmUpCi0gICAgewotCS8qIENoZWNrIGlmIHRoZSB3b3JkIGlzIGFscmVhZHkgdGhlcmUuICBBbHNvIGNoZWNrIHRoZSBsZW5ndGggdGhhdCBpcwotCSAqIGJlaW5nIHJlcGxhY2VkICJ0aGVzLCIgLT4gInRoZXNlIiBpcyBhIGRpZmZlcmVudCBzdWdnZXN0aW9uIGZyb20KLQkgKiAidGhlcyIgLT4gInRoZXNlIi4gKi8KLQlzdHAgPSAmU1VHKCpnYXAsIDApOwotCWZvciAoaSA9IGdhcC0+Z2FfbGVuIC0gMTsgaSA+PSAwOyAtLWkpCi0JICAgIGlmICgoaW50KVNUUkxFTihzdHBbaV0uc3Rfd29yZCkgPT0gZ29vZGxlbgotCQkJJiYgU1RSTkNNUChzdHBbaV0uc3Rfd29yZCwgZ29vZHdvcmQsIGdvb2RsZW4pID09IDAKLQkJCQkJCSYmIHN0cFtpXS5zdF9vcmdsZW4gPT0gYmFkbGVuKQorICAgIC8qIENoZWNrIGlmIHRoZSB3b3JkIGlzIGFscmVhZHkgdGhlcmUuICBBbHNvIGNoZWNrIHRoZSBsZW5ndGggdGhhdCBpcworICAgICAqIGJlaW5nIHJlcGxhY2VkICJ0aGVzLCIgLT4gInRoZXNlIiBpcyBhIGRpZmZlcmVudCBzdWdnZXN0aW9uIGZyb20KKyAgICAgKiAidGhlcyIgLT4gInRoZXNlIi4gKi8KKyAgICBzdHAgPSAmU1VHKCpnYXAsIDApOworICAgIGZvciAoaSA9IGdhcC0+Z2FfbGVuOyAtLWkgPj0gMDsgKytzdHApCisJaWYgKHN0cC0+c3Rfd29yZGxlbiA9PSBnb29kbGVuCisJCSYmIHN0cC0+c3Rfb3JnbGVuID09IGJhZGxlbgorCQkmJiBTVFJOQ01QKHN0cC0+c3Rfd29yZCwgZ29vZHdvcmQsIGdvb2RsZW4pID09IDApCisJeworCSAgICAvKgorCSAgICAgKiBGb3VuZCBpdC4gIFJlbWVtYmVyIHRoZSB3b3JkIHdpdGggdGhlIGxvd2VzdCBzY29yZS4KKwkgICAgICovCisJICAgIGlmIChzdHAtPnN0X3NsYW5nID09IE5VTEwpCisJCXN0cC0+c3Rfc2xhbmcgPSBzbGFuZzsKKworCSAgICBuZXdfc3VnLnN0X3Njb3JlID0gc2NvcmU7CisJICAgIG5ld19zdWcuc3RfYWx0c2NvcmUgPSBhbHRzY29yZTsKKwkgICAgbmV3X3N1Zy5zdF9oYWRfYm9udXMgPSBoYWRfYm9udXM7CisKKwkgICAgaWYgKHN0cC0+c3RfaGFkX2JvbnVzICE9IGhhZF9ib251cykKIAkgICAgewotCQkvKgotCQkgKiBGb3VuZCBpdC4gIFJlbWVtYmVyIHRoZSB3b3JkIHdpdGggdGhlIGxvd2VzdCBzY29yZS4KLQkJICovCi0JCWlmIChzdHBbaV0uc3Rfc2xhbmcgPT0gTlVMTCkKLQkJICAgIHN0cFtpXS5zdF9zbGFuZyA9IHNsYW5nOwotCi0JCW5ld19zdWcuc3Rfc2NvcmUgPSBzY29yZTsKLQkJbmV3X3N1Zy5zdF9hbHRzY29yZSA9IGFsdHNjb3JlOwotCQluZXdfc3VnLnN0X2hhZF9ib251cyA9IGhhZF9ib251czsKLQotCQlpZiAoc3RwW2ldLnN0X2hhZF9ib251cyAhPSBoYWRfYm9udXMpCisJCS8qIE9ubHkgb25lIG9mIHRoZSB0d28gaGFkIHRoZSBzb3VuZGFsaWtlIHNjb3JlIGNvbXB1dGVkLgorCQkgKiBOZWVkIHRvIGRvIHRoYXQgZm9yIHRoZSBvdGhlciBvbmUgbm93LCBvdGhlcndpc2UgdGhlCisJCSAqIHNjb3JlcyBjYW4ndCBiZSBjb21wYXJlZC4gIFRoaXMgaGFwcGVucyBiZWNhdXNlCisJCSAqIHN1Z2dlc3RfdHJ5X2NoYW5nZSgpIGRvZXNuJ3QgY29tcHV0ZSB0aGUgc291bmRhbGlrZQorCQkgKiB3b3JkIHRvIGtlZXAgaXQgZmFzdCwgd2hpbGUgc29tZSBzcGVjaWFsIG1ldGhvZHMgc2V0CisJCSAqIHRoZSBzb3VuZGFsaWtlIHNjb3JlIHRvIHplcm8uICovCisJCWlmIChoYWRfYm9udXMpCisJCSAgICByZXNjb3JlX29uZShzdSwgc3RwKTsKKwkJZWxzZQogCQl7Ci0JCSAgICAvKiBPbmx5IG9uZSBvZiB0aGUgdHdvIGhhZCB0aGUgc291bmRhbGlrZSBzY29yZSBjb21wdXRlZC4KLQkJICAgICAqIE5lZWQgdG8gZG8gdGhhdCBmb3IgdGhlIG90aGVyIG9uZSBub3csIG90aGVyd2lzZSB0aGUKLQkJICAgICAqIHNjb3JlcyBjYW4ndCBiZSBjb21wYXJlZC4gIFRoaXMgaGFwcGVucyBiZWNhdXNlCi0JCSAgICAgKiBzdWdnZXN0X3RyeV9jaGFuZ2UoKSBkb2Vzbid0IGNvbXB1dGUgdGhlIHNvdW5kYWxpa2UKLQkJICAgICAqIHdvcmQgdG8ga2VlcCBpdCBmYXN0LCB3aGlsZSBzb21lIHNwZWNpYWwgbWV0aG9kcyBzZXQKLQkJICAgICAqIHRoZSBzb3VuZGFsaWtlIHNjb3JlIHRvIHplcm8uICovCi0JCSAgICBpZiAoaGFkX2JvbnVzKQotCQkJcmVzY29yZV9vbmUoc3UsICZzdHBbaV0pOwotCQkgICAgZWxzZQotCQkgICAgewotCQkJbmV3X3N1Zy5zdF93b3JkID0gZ29vZHdvcmQ7Ci0JCQluZXdfc3VnLnN0X3NsYW5nID0gc3RwW2ldLnN0X3NsYW5nOwotCQkJbmV3X3N1Zy5zdF9vcmdsZW4gPSBiYWRsZW47Ci0JCQlyZXNjb3JlX29uZShzdSwgJm5ld19zdWcpOwotCQkgICAgfQorCQkgICAgbmV3X3N1Zy5zdF93b3JkID0gc3RwLT5zdF93b3JkOworCQkgICAgbmV3X3N1Zy5zdF93b3JkbGVuID0gc3RwLT5zdF93b3JkbGVuOworCQkgICAgbmV3X3N1Zy5zdF9zbGFuZyA9IHN0cC0+c3Rfc2xhbmc7CisJCSAgICBuZXdfc3VnLnN0X29yZ2xlbiA9IGJhZGxlbjsKKwkJICAgIHJlc2NvcmVfb25lKHN1LCAmbmV3X3N1Zyk7CiAJCX0KLQotCQlpZiAoc3RwW2ldLnN0X3Njb3JlID4gbmV3X3N1Zy5zdF9zY29yZSkKLQkJewotCQkgICAgc3RwW2ldLnN0X3Njb3JlID0gbmV3X3N1Zy5zdF9zY29yZTsKLQkJICAgIHN0cFtpXS5zdF9hbHRzY29yZSA9IG5ld19zdWcuc3RfYWx0c2NvcmU7Ci0JCSAgICBzdHBbaV0uc3RfaGFkX2JvbnVzID0gbmV3X3N1Zy5zdF9oYWRfYm9udXM7Ci0JCX0KLQkJYnJlYWs7CiAJICAgIH0KIAotCWlmIChpIDwgMCAmJiBnYV9ncm93KGdhcCwgMSkgPT0gT0spCi0JewotCSAgICAvKiBBZGQgYSBzdWdnZXN0aW9uLiAqLwotCSAgICBzdHAgPSAmU1VHKCpnYXAsIGdhcC0+Z2FfbGVuKTsKLQkgICAgc3RwLT5zdF93b3JkID0gdmltX3N0cm5zYXZlKGdvb2R3b3JkLCBnb29kbGVuKTsKLQkgICAgaWYgKHN0cC0+c3Rfd29yZCAhPSBOVUxMKQorCSAgICBpZiAoc3RwLT5zdF9zY29yZSA+IG5ld19zdWcuc3Rfc2NvcmUpCiAJICAgIHsKLQkJc3RwLT5zdF9zY29yZSA9IHNjb3JlOwotCQlzdHAtPnN0X2FsdHNjb3JlID0gYWx0c2NvcmU7Ci0JCXN0cC0+c3RfaGFkX2JvbnVzID0gaGFkX2JvbnVzOwotCQlzdHAtPnN0X29yZ2xlbiA9IGJhZGxlbjsKLQkJc3RwLT5zdF9zbGFuZyA9IHNsYW5nOwotCQkrK2dhcC0+Z2FfbGVuOworCQlzdHAtPnN0X3Njb3JlID0gbmV3X3N1Zy5zdF9zY29yZTsKKwkJc3RwLT5zdF9hbHRzY29yZSA9IG5ld19zdWcuc3RfYWx0c2NvcmU7CisJCXN0cC0+c3RfaGFkX2JvbnVzID0gbmV3X3N1Zy5zdF9oYWRfYm9udXM7CisJICAgIH0KKwkgICAgYnJlYWs7CisJfQogCi0JCS8qIElmIHdlIGhhdmUgdG9vIG1hbnkgc3VnZ2VzdGlvbnMgbm93LCBzb3J0IHRoZSBsaXN0IGFuZCBrZWVwCi0JCSAqIHRoZSBiZXN0IHN1Z2dlc3Rpb25zLiAqLwotCQlpZiAoZ2FwLT5nYV9sZW4gPiBTVUdfTUFYX0NPVU5UKHN1KSkKLQkJICAgIHN1LT5zdV9tYXhzY29yZSA9IGNsZWFudXBfc3VnZ2VzdGlvbnMoZ2FwLCBzdS0+c3VfbWF4c2NvcmUsCi0JCQkJCQkJIFNVR19DTEVBTl9DT1VOVChzdSkpOworICAgIGlmIChpIDwgMCAmJiBnYV9ncm93KGdhcCwgMSkgPT0gT0spCisgICAgeworCS8qIEFkZCBhIHN1Z2dlc3Rpb24uICovCisJc3RwID0gJlNVRygqZ2FwLCBnYXAtPmdhX2xlbik7CisJc3RwLT5zdF93b3JkID0gdmltX3N0cm5zYXZlKGdvb2R3b3JkLCBnb29kbGVuKTsKKwlpZiAoc3RwLT5zdF93b3JkICE9IE5VTEwpCisJeworCSAgICBzdHAtPnN0X3dvcmRsZW4gPSBnb29kbGVuOworCSAgICBzdHAtPnN0X3Njb3JlID0gc2NvcmU7CisJICAgIHN0cC0+c3RfYWx0c2NvcmUgPSBhbHRzY29yZTsKKwkgICAgc3RwLT5zdF9oYWRfYm9udXMgPSBoYWRfYm9udXM7CisJICAgIHN0cC0+c3Rfb3JnbGVuID0gYmFkbGVuOworCSAgICBzdHAtPnN0X3NsYW5nID0gc2xhbmc7CisJICAgICsrZ2FwLT5nYV9sZW47CisKKwkgICAgLyogSWYgd2UgaGF2ZSB0b28gbWFueSBzdWdnZXN0aW9ucyBub3csIHNvcnQgdGhlIGxpc3QgYW5kIGtlZXAKKwkgICAgICogdGhlIGJlc3Qgc3VnZ2VzdGlvbnMuICovCisJICAgIGlmIChnYXAtPmdhX2xlbiA+IFNVR19NQVhfQ09VTlQoc3UpKQorCSAgICB7CisJCWlmIChtYXhzZikKKwkJICAgIHN1LT5zdV9zZm1heHNjb3JlID0gY2xlYW51cF9zdWdnZXN0aW9ucyhnYXAsCisJCQkJICAgICAgc3UtPnN1X3NmbWF4c2NvcmUsIFNVR19DTEVBTl9DT1VOVChzdSkpOworCQllbHNlCisJCXsKKwkJICAgIGkgPSBzdS0+c3VfbWF4c2NvcmU7CisJCSAgICBzdS0+c3VfbWF4c2NvcmUgPSBjbGVhbnVwX3N1Z2dlc3Rpb25zKGdhcCwKKwkJCQkJc3UtPnN1X21heHNjb3JlLCBTVUdfQ0xFQU5fQ09VTlQoc3UpKTsKKwkJfQogCSAgICB9CiAJfQogICAgIH0KIH0KIAogLyoKKyAqIFN1Z2dlc3Rpb25zIG1heSBpbiBmYWN0IGJlIGZsYWdnZWQgYXMgZXJyb3JzLiAgRXNwLiBmb3IgYmFubmVkIHdvcmRzIGFuZAorICogZm9yIHNwbGl0IHdvcmRzLCBzdWNoIGFzICJ0aGUgdGhlIi4gIFJlbW92ZSB0aGVzZSBmcm9tIHRoZSBsaXN0IGhlcmUuCisgKi8KKyAgICBzdGF0aWMgdm9pZAorY2hlY2tfc3VnZ2VzdGlvbnMoc3UsIGdhcCkKKyAgICBzdWdpbmZvX1QJKnN1OworICAgIGdhcnJheV9UCSpnYXA7CQkgICAgLyogZWl0aGVyIHN1X2dhIG9yIHN1X3NnYSAqLworeworICAgIHN1Z2dlc3RfVCAgICpzdHA7CisgICAgaW50CQlpOworICAgIGNoYXJfdQlsb25nd29yZFtNQVhXTEVOICsgMV07CisgICAgaW50CQlsZW47CisgICAgaGxmX1QJYXR0cjsKKworICAgIHN0cCA9ICZTVUcoKmdhcCwgMCk7CisgICAgZm9yIChpID0gZ2FwLT5nYV9sZW4gLSAxOyBpID49IDA7IC0taSkKKyAgICB7CisJLyogTmVlZCB0byBhcHBlbmQgd2hhdCBmb2xsb3dzIHRvIGNoZWNrIGZvciAidGhlIHRoZSIuICovCisJU1RSQ1BZKGxvbmd3b3JkLCBzdHBbaV0uc3Rfd29yZCk7CisJbGVuID0gc3RwW2ldLnN0X3dvcmRsZW47CisJdmltX3N0cm5jcHkobG9uZ3dvcmQgKyBsZW4sIHN1LT5zdV9iYWRwdHIgKyBzdHBbaV0uc3Rfb3JnbGVuLAorCQkJCQkJCSAgICAgICBNQVhXTEVOIC0gbGVuKTsKKwlhdHRyID0gSExGX0NPVU5UOworCSh2b2lkKXNwZWxsX2NoZWNrKGN1cndpbiwgbG9uZ3dvcmQsICZhdHRyLCBOVUxMLCBGQUxTRSk7CisJaWYgKGF0dHIgIT0gSExGX0NPVU5UKQorCXsKKwkgICAgLyogUmVtb3ZlIHRoaXMgZW50cnkuICovCisJICAgIHZpbV9mcmVlKHN0cFtpXS5zdF93b3JkKTsKKwkgICAgLS1nYXAtPmdhX2xlbjsKKwkgICAgaWYgKGkgPCBnYXAtPmdhX2xlbikKKwkJbWNoX21lbW1vdmUoc3RwICsgaSwgc3RwICsgaSArIDEsCisJCQkJICAgICAgIHNpemVvZihzdWdnZXN0X1QpICogKGdhcC0+Z2FfbGVuIC0gaSkpOworCX0KKyAgICB9Cit9CisKKworLyoKICAqIEFkZCBhIHdvcmQgdG8gYmUgYmFubmVkLgogICovCiAgICAgc3RhdGljIHZvaWQKQEAgLTExMzQ4LDUzICsxMzAzMCwxNyBAQAogICAgIGhhc2hfVAloYXNoOwogICAgIGhhc2hpdGVtX1QJKmhpOwogCi0gICAgaWYgKHMgIT0gTlVMTCkKKyAgICBoYXNoID0gaGFzaF9oYXNoKHdvcmQpOworICAgIGhpID0gaGFzaF9sb29rdXAoJnN1LT5zdV9iYW5uZWQsIHdvcmQsIGhhc2gpOworICAgIGlmIChIQVNISVRFTV9FTVBUWShoaSkpCiAgICAgewotCWhhc2ggPSBoYXNoX2hhc2gocyk7Ci0JaGkgPSBoYXNoX2xvb2t1cCgmc3UtPnN1X2Jhbm5lZCwgcywgaGFzaCk7Ci0JaWYgKEhBU0hJVEVNX0VNUFRZKGhpKSkKKwlzID0gdmltX3N0cnNhdmUod29yZCk7CisJaWYgKHMgIT0gTlVMTCkKIAkgICAgaGFzaF9hZGRfaXRlbSgmc3UtPnN1X2Jhbm5lZCwgaGksIHMsIGhhc2gpOwotCWVsc2UKLQkgICAgdmltX2ZyZWUocyk7CiAgICAgfQogfQogCiAvKgotICogUmV0dXJuIFRSVUUgaWYgYSB3b3JkIGFwcGVhcnMgaW4gdGhlIGxpc3Qgb2YgYmFubmVkIHdvcmRzLgotICovCi0gICAgc3RhdGljIGludAotd2FzX2Jhbm5lZChzdSwgd29yZCkKLSAgICBzdWdpbmZvX1QJKnN1OwotICAgIGNoYXJfdQkqd29yZDsKLXsKLSAgICBoYXNoaXRlbV9UCSpoaSA9IGhhc2hfZmluZCgmc3UtPnN1X2Jhbm5lZCwgd29yZCk7Ci0KLSAgICByZXR1cm4gIUhBU0hJVEVNX0VNUFRZKGhpKTsKLX0KLQotLyoKLSAqIEZyZWUgdGhlIGJhbm5lZCB3b3JkcyBpbiAic3UiLgotICovCi0gICAgc3RhdGljIHZvaWQKLWZyZWVfYmFubmVkKHN1KQotICAgIHN1Z2luZm9fVAkqc3U7Ci17Ci0gICAgaW50CQl0b2RvOwotICAgIGhhc2hpdGVtX1QJKmhpOwotCi0gICAgdG9kbyA9IHN1LT5zdV9iYW5uZWQuaHRfdXNlZDsKLSAgICBmb3IgKGhpID0gc3UtPnN1X2Jhbm5lZC5odF9hcnJheTsgdG9kbyA+IDA7ICsraGkpCi0gICAgewotCWlmICghSEFTSElURU1fRU1QVFkoaGkpKQotCXsKLQkgICAgdmltX2ZyZWUoaGktPmhpX2tleSk7Ci0JICAgIC0tdG9kbzsKLQl9Ci0gICAgfQotICAgIGhhc2hfY2xlYXIoJnN1LT5zdV9iYW5uZWQpOwotfQotCi0vKgogICogUmVjb21wdXRlIHRoZSBzY29yZSBmb3IgYWxsIHN1Z2dlc3Rpb25zIGlmIHNvdW5kLWZvbGRpbmcgaXMgcG9zc2libGUuICBUaGlzCiAgKiBpcyBzbG93LCB0aHVzIG9ubHkgZG9uZSBmb3IgdGhlIGZpbmFsIHJlc3VsdHMuCiAgKi8KQEAgLTEyMjcwLDExICsxMzkxNiwyMSBAQAogICAgICAqIGNvdW50ZWQgc28gbXVjaCwgdm93ZWxzIGhhbGZ3YXkgdGhlIHdvcmQgYXJlbid0IGNvdW50ZWQgYXQgYWxsLiAqLwogICAgIGlmICgoKmJhZHNvdW5kID09ICcqJyB8fCAqZ29vZHNvdW5kID09ICcqJykgJiYgKmJhZHNvdW5kICE9ICpnb29kc291bmQpCiAgICAgewotCXNjb3JlID0gU0NPUkVfREVMIC8gMjsKLQlpZiAoKmJhZHNvdW5kID09ICcqJykKLQkgICAgKytiYWRzb3VuZDsKKwlpZiAoYmFkc291bmRbMV0gPT0gZ29vZHNvdW5kWzFdCisJCXx8IChiYWRzb3VuZFsxXSAhPSBOVUwKKwkJICAgICYmIGdvb2Rzb3VuZFsxXSAhPSBOVUwKKwkJICAgICYmIGJhZHNvdW5kWzJdID09IGdvb2Rzb3VuZFsyXSkpCisJeworCSAgICAvKiBoYW5kbGUgbGlrZSBhIHN1YnN0aXR1dGUgKi8KKwl9CiAJZWxzZQotCSAgICArK2dvb2Rzb3VuZDsKKwl7CisJICAgIHNjb3JlID0gMiAqIFNDT1JFX0RFTCAvIDM7CisJICAgIGlmICgqYmFkc291bmQgPT0gJyonKQorCQkrK2JhZHNvdW5kOworCSAgICBlbHNlCisJCSsrZ29vZHNvdW5kOworCX0KICAgICB9CiAKICAgICBnb29kbGVuID0gU1RSTEVOKGdvb2Rzb3VuZCk7CkBAIC0xMjQ3MCw3ICsxNDEyNiw4IEBACiAgKiBzdXBwb3J0IG11bHRpLWJ5dGUgY2hhcmFjdGVycy4KICAqLwogICAgIHN0YXRpYyBpbnQKLXNwZWxsX2VkaXRfc2NvcmUoYmFkd29yZCwgZ29vZHdvcmQpCitzcGVsbF9lZGl0X3Njb3JlKHNsYW5nLCBiYWR3b3JkLCBnb29kd29yZCkKKyAgICBzbGFuZ19UCSpzbGFuZzsKICAgICBjaGFyX3UJKmJhZHdvcmQ7CiAgICAgY2hhcl91CSpnb29kd29yZDsKIHsKQEAgLTEyNTEyLDExICsxNDE2OSwxMSBAQAogCiAgICAgQ05UKDAsIDApID0gMDsKICAgICBmb3IgKGogPSAxOyBqIDw9IGdvb2RsZW47ICsraikKLQlDTlQoMCwgaikgPSBDTlQoMCwgaiAtIDEpICsgU0NPUkVfREVMOworCUNOVCgwLCBqKSA9IENOVCgwLCBqIC0gMSkgKyBTQ09SRV9JTlM7CiAKICAgICBmb3IgKGkgPSAxOyBpIDw9IGJhZGxlbjsgKytpKQogICAgIHsKLQlDTlQoaSwgMCkgPSBDTlQoaSAtIDEsIDApICsgU0NPUkVfSU5TOworCUNOVChpLCAwKSA9IENOVChpIC0gMSwgMCkgKyBTQ09SRV9ERUw7CiAJZm9yIChqID0gMTsgaiA8PSBnb29kbGVuOyArK2opCiAJewogI2lmZGVmIEZFQVRfTUJZVEUKQEAgLTEyNTM5LDcgKzE0MTk2LDE1IEBACiAJCWlmIChTUEVMTF9UT0ZPTEQoYmMpID09IFNQRUxMX1RPRk9MRChnYykpCiAJCSAgICBDTlQoaSwgaikgPSBTQ09SRV9JQ0FTRSArIENOVChpIC0gMSwgaiAtIDEpOwogCQllbHNlCi0JCSAgICBDTlQoaSwgaikgPSBTQ09SRV9TVUJTVCArIENOVChpIC0gMSwgaiAtIDEpOworCQl7CisJCSAgICAvKiBGb3IgYSBzaW1pbGFyIGNoYXJhY3RlciB1c2UgU0NPUkVfU0lNSUxBUi4gKi8KKwkJICAgIGlmIChzbGFuZyAhPSBOVUxMCisJCQkgICAgJiYgc2xhbmctPnNsX2hhc19tYXAKKwkJCSAgICAmJiBzaW1pbGFyX2NoYXJzKHNsYW5nLCBnYywgYmMpKQorCQkJQ05UKGksIGopID0gU0NPUkVfU0lNSUxBUiArIENOVChpIC0gMSwgaiAtIDEpOworCQkgICAgZWxzZQorCQkJQ05UKGksIGopID0gU0NPUkVfU1VCU1QgKyBDTlQoaSAtIDEsIGogLSAxKTsKKwkJfQogCiAJCWlmIChpID4gMSAmJiBqID4gMSkKIAkJewpAQCAtMTI1NzcsNiArMTQyNDIsMzkyIEBACiAgICAgcmV0dXJuIGk7CiB9CiAKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50CQliYWRpOworICAgIGludAkJZ29vZGk7CisgICAgaW50CQlzY29yZTsKK30gbGltaXRzY29yZV9UOworCisvKgorICogTGlrZSBzcGVsbF9lZGl0X3Njb3JlKCksIGJ1dCB3aXRoIGEgbGltaXQgb24gdGhlIHNjb3JlIHRvIG1ha2UgaXQgZmFzdGVyLgorICogTWF5IHJldHVybiBTQ09SRV9NQVhNQVggd2hlbiB0aGUgc2NvcmUgaXMgaGlnaGVyIHRoYW4gImxpbWl0Ii4KKyAqCisgKiBUaGlzIHVzZXMgYSBzdGFjayBmb3IgdGhlIGVkaXRzIHN0aWxsIHRvIGJlIHRyaWVkLgorICogVGhlIGlkZWEgY29tZXMgZnJvbSBBc3BlbGwgbGVkaXRkaXN0LmNwcC4gIFJld3JpdHRlbiBpbiBDIGFuZCBhZGRlZCBzdXBwb3J0CisgKiBmb3IgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzLgorICovCisgICAgc3RhdGljIGludAorc3BlbGxfZWRpdF9zY29yZV9saW1pdChzbGFuZywgYmFkd29yZCwgZ29vZHdvcmQsIGxpbWl0KQorICAgIHNsYW5nX1QJKnNsYW5nOworICAgIGNoYXJfdQkqYmFkd29yZDsKKyAgICBjaGFyX3UJKmdvb2R3b3JkOworICAgIGludAkJbGltaXQ7Cit7CisgICAgbGltaXRzY29yZV9UICAgIHN0YWNrWzEwXTsJCS8qIGFsbG93IGZvciBvdmVyIDMgKiAyIGVkaXRzICovCisgICAgaW50CQkgICAgc3RhY2tpZHg7CisgICAgaW50CQkgICAgYmksIGdpOworICAgIGludAkJICAgIGJpMiwgZ2kyOworICAgIGludAkJICAgIGJjLCBnYzsKKyAgICBpbnQJCSAgICBzY29yZTsKKyAgICBpbnQJCSAgICBzY29yZV9vZmY7CisgICAgaW50CQkgICAgbWluc2NvcmU7CisgICAgaW50CQkgICAgcm91bmQ7CisKKyNpZmRlZiBGRUFUX01CWVRFCisgICAgLyogTXVsdGktYnl0ZSBjaGFyYWN0ZXJzIHJlcXVpcmUgYSBiaXQgbW9yZSB3b3JrLCB1c2UgYSBkaWZmZXJlbnQgZnVuY3Rpb24KKyAgICAgKiB0byBhdm9pZCB0ZXN0aW5nICJoYXNfbWJ5dGUiIHF1aXRlIG9mdGVuLiAqLworICAgIGlmIChoYXNfbWJ5dGUpCisJcmV0dXJuIHNwZWxsX2VkaXRfc2NvcmVfbGltaXRfdyhzbGFuZywgYmFkd29yZCwgZ29vZHdvcmQsIGxpbWl0KTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBUaGUgaWRlYSBpcyB0byBnbyBmcm9tIHN0YXJ0IHRvIGVuZCBvdmVyIHRoZSB3b3Jkcy4gIFNvIGxvbmcgYXMKKyAgICAgKiBjaGFyYWN0ZXJzIGFyZSBlcXVhbCBqdXN0IGNvbnRpbnVlLCB0aGlzIGFsd2F5cyBnaXZlcyB0aGUgbG93ZXN0IHNjb3JlLgorICAgICAqIFdoZW4gdGhlcmUgaXMgYSBkaWZmZXJlbmNlIHRyeSBzZXZlcmFsIGFsdGVybmF0aXZlcy4gIEVhY2ggYWx0ZXJuYXRpdmUKKyAgICAgKiBpbmNyZWFzZXMgInNjb3JlIiBmb3IgdGhlIGVkaXQgZGlzdGFuY2UuICBTb21lIG9mIHRoZSBhbHRlcm5hdGl2ZXMgYXJlCisgICAgICogcHVzaGVkIHVudG8gYSBzdGFjayBhbmQgdHJpZWQgbGF0ZXIsIHNvbWUgYXJlIHRyaWVkIHJpZ2h0IGF3YXkuICBBdCB0aGUKKyAgICAgKiBlbmQgb2YgdGhlIHdvcmQgdGhlIHNjb3JlIGZvciBvbmUgYWx0ZXJuYXRpdmUgaXMga25vd24uICBUaGUgbG93ZXN0CisgICAgICogcG9zc2libGUgc2NvcmUgaXMgc3RvcmVkIGluICJtaW5zY29yZSIuCisgICAgICovCisgICAgc3RhY2tpZHggPSAwOworICAgIGJpID0gMDsKKyAgICBnaSA9IDA7CisgICAgc2NvcmUgPSAwOworICAgIG1pbnNjb3JlID0gbGltaXQgKyAxOworCisgICAgZm9yICg7OykKKyAgICB7CisJLyogU2tpcCBvdmVyIGFuIGVxdWFsIHBhcnQsIHNjb3JlIHJlbWFpbnMgdGhlIHNhbWUuICovCisJZm9yICg7OykKKwl7CisJICAgIGJjID0gYmFkd29yZFtiaV07CisJICAgIGdjID0gZ29vZHdvcmRbZ2ldOworCSAgICBpZiAoYmMgIT0gZ2MpCS8qIHN0b3AgYXQgYSBjaGFyIHRoYXQncyBkaWZmZXJlbnQgKi8KKwkJYnJlYWs7CisJICAgIGlmIChiYyA9PSBOVUwpCS8qIGJvdGggd29yZHMgZW5kICovCisJICAgIHsKKwkJaWYgKHNjb3JlIDwgbWluc2NvcmUpCisJCSAgICBtaW5zY29yZSA9IHNjb3JlOworCQlnb3RvIHBvcDsJLyogZG8gbmV4dCBhbHRlcm5hdGl2ZSAqLworCSAgICB9CisJICAgICsrYmk7CisJICAgICsrZ2k7CisJfQorCisJaWYgKGdjID09IE5VTCkgICAgLyogZ29vZHdvcmQgZW5kcywgZGVsZXRlIGJhZHdvcmQgY2hhcnMgKi8KKwl7CisJICAgIGRvCisJICAgIHsKKwkJaWYgKChzY29yZSArPSBTQ09SRV9ERUwpID49IG1pbnNjb3JlKQorCQkgICAgZ290byBwb3A7CSAgICAvKiBkbyBuZXh0IGFsdGVybmF0aXZlICovCisJICAgIH0gd2hpbGUgKGJhZHdvcmRbKytiaV0gIT0gTlVMKTsKKwkgICAgbWluc2NvcmUgPSBzY29yZTsKKwl9CisJZWxzZSBpZiAoYmMgPT0gTlVMKSAvKiBiYWR3b3JkIGVuZHMsIGluc2VydCBiYWR3b3JkIGNoYXJzICovCisJeworCSAgICBkbworCSAgICB7CisJCWlmICgoc2NvcmUgKz0gU0NPUkVfSU5TKSA+PSBtaW5zY29yZSkKKwkJICAgIGdvdG8gcG9wOwkgICAgLyogZG8gbmV4dCBhbHRlcm5hdGl2ZSAqLworCSAgICB9IHdoaWxlIChnb29kd29yZFsrK2dpXSAhPSBOVUwpOworCSAgICBtaW5zY29yZSA9IHNjb3JlOworCX0KKwllbHNlCQkJLyogYm90aCB3b3JkcyBjb250aW51ZSAqLworCXsKKwkgICAgLyogSWYgbm90IGNsb3NlIHRvIHRoZSBsaW1pdCwgcGVyZm9ybSBhIGNoYW5nZS4gIE9ubHkgdHJ5IGNoYW5nZXMKKwkgICAgICogdGhhdCBtYXkgbGVhZCB0byBhIGxvd2VyIHNjb3JlIHRoYW4gIm1pbnNjb3JlIi4KKwkgICAgICogcm91bmQgMDogdHJ5IGRlbGV0aW5nIGEgY2hhciBmcm9tIGJhZHdvcmQKKwkgICAgICogcm91bmQgMTogdHJ5IGluc2VydGluZyBhIGNoYXIgaW4gYmFkd29yZCAqLworCSAgICBmb3IgKHJvdW5kID0gMDsgcm91bmQgPD0gMTsgKytyb3VuZCkKKwkgICAgeworCQlzY29yZV9vZmYgPSBzY29yZSArIChyb3VuZCA9PSAwID8gU0NPUkVfREVMIDogU0NPUkVfSU5TKTsKKwkJaWYgKHNjb3JlX29mZiA8IG1pbnNjb3JlKQorCQl7CisJCSAgICBpZiAoc2NvcmVfb2ZmICsgU0NPUkVfRURJVF9NSU4gPj0gbWluc2NvcmUpCisJCSAgICB7CisJCQkvKiBOZWFyIHRoZSBsaW1pdCwgcmVzdCBvZiB0aGUgd29yZHMgbXVzdCBtYXRjaC4gIFdlCisJCQkgKiBjYW4gY2hlY2sgdGhhdCByaWdodCBub3csIG5vIG5lZWQgdG8gcHVzaCBhbiBpdGVtCisJCQkgKiBvbnRvIHRoZSBzdGFjay4gKi8KKwkJCWJpMiA9IGJpICsgMSAtIHJvdW5kOworCQkJZ2kyID0gZ2kgKyByb3VuZDsKKwkJCXdoaWxlIChnb29kd29yZFtnaTJdID09IGJhZHdvcmRbYmkyXSkKKwkJCXsKKwkJCSAgICBpZiAoZ29vZHdvcmRbZ2kyXSA9PSBOVUwpCisJCQkgICAgeworCQkJCW1pbnNjb3JlID0gc2NvcmVfb2ZmOworCQkJCWJyZWFrOworCQkJICAgIH0KKwkJCSAgICArK2JpMjsKKwkJCSAgICArK2dpMjsKKwkJCX0KKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKwkJCS8qIHRyeSBkZWxldGluZy9pbnNlcnRpbmcgYSBjaGFyYWN0ZXIgbGF0ZXIgKi8KKwkJCXN0YWNrW3N0YWNraWR4XS5iYWRpID0gYmkgKyAxIC0gcm91bmQ7CisJCQlzdGFja1tzdGFja2lkeF0uZ29vZGkgPSBnaSArIHJvdW5kOworCQkJc3RhY2tbc3RhY2tpZHhdLnNjb3JlID0gc2NvcmVfb2ZmOworCQkJKytzdGFja2lkeDsKKwkJICAgIH0KKwkJfQorCSAgICB9CisKKwkgICAgaWYgKHNjb3JlICsgU0NPUkVfU1dBUCA8IG1pbnNjb3JlKQorCSAgICB7CisJCS8qIElmIHN3YXBwaW5nIHR3byBjaGFyYWN0ZXJzIG1ha2VzIGEgbWF0Y2ggdGhlbiB0aGUKKwkJICogc3Vic3RpdHV0aW9uIGlzIG1vcmUgZXhwZW5zaXZlLCB0aHVzIHRoZXJlIGlzIG5vIG5lZWQgdG8KKwkJICogdHJ5IGJvdGguICovCisJCWlmIChnYyA9PSBiYWR3b3JkW2JpICsgMV0gJiYgYmMgPT0gZ29vZHdvcmRbZ2kgKyAxXSkKKwkJeworCQkgICAgLyogU3dhcCB0d28gY2hhcmFjdGVycywgdGhhdCBpczogc2tpcCB0aGVtLiAqLworCQkgICAgZ2kgKz0gMjsKKwkJICAgIGJpICs9IDI7CisJCSAgICBzY29yZSArPSBTQ09SRV9TV0FQOworCQkgICAgY29udGludWU7CisJCX0KKwkgICAgfQorCisJICAgIC8qIFN1YnN0aXR1dGUgb25lIGNoYXJhY3RlciBmb3IgYW5vdGhlciB3aGljaCBpcyB0aGUgc2FtZQorCSAgICAgKiB0aGluZyBhcyBkZWxldGluZyBhIGNoYXJhY3RlciBmcm9tIGJvdGggZ29vZHdvcmQgYW5kIGJhZHdvcmQuCisJICAgICAqIFVzZSBhIGJldHRlciBzY29yZSB3aGVuIHRoZXJlIGlzIG9ubHkgYSBjYXNlIGRpZmZlcmVuY2UuICovCisJICAgIGlmIChTUEVMTF9UT0ZPTEQoYmMpID09IFNQRUxMX1RPRk9MRChnYykpCisJCXNjb3JlICs9IFNDT1JFX0lDQVNFOworCSAgICBlbHNlCisJICAgIHsKKwkJLyogRm9yIGEgc2ltaWxhciBjaGFyYWN0ZXIgdXNlIFNDT1JFX1NJTUlMQVIuICovCisJCWlmIChzbGFuZyAhPSBOVUxMCisJCQkmJiBzbGFuZy0+c2xfaGFzX21hcAorCQkJJiYgc2ltaWxhcl9jaGFycyhzbGFuZywgZ2MsIGJjKSkKKwkJICAgIHNjb3JlICs9IFNDT1JFX1NJTUlMQVI7CisJCWVsc2UKKwkJICAgIHNjb3JlICs9IFNDT1JFX1NVQlNUOworCSAgICB9CisKKwkgICAgaWYgKHNjb3JlIDwgbWluc2NvcmUpCisJICAgIHsKKwkJLyogRG8gdGhlIHN1YnN0aXR1dGlvbi4gKi8KKwkJKytnaTsKKwkJKytiaTsKKwkJY29udGludWU7CisJICAgIH0KKwl9Citwb3A6CisJLyoKKwkgKiBHZXQgaGVyZSB0byB0cnkgdGhlIG5leHQgYWx0ZXJuYXRpdmUsIHBvcCBpdCBmcm9tIHRoZSBzdGFjay4KKwkgKi8KKwlpZiAoc3RhY2tpZHggPT0gMCkJCS8qIHN0YWNrIGlzIGVtcHR5LCBmaW5pc2hlZCAqLworCSAgICBicmVhazsKKworCS8qIHBvcCBhbiBpdGVtIGZyb20gdGhlIHN0YWNrICovCisJLS1zdGFja2lkeDsKKwlnaSA9IHN0YWNrW3N0YWNraWR4XS5nb29kaTsKKwliaSA9IHN0YWNrW3N0YWNraWR4XS5iYWRpOworCXNjb3JlID0gc3RhY2tbc3RhY2tpZHhdLnNjb3JlOworICAgIH0KKworICAgIC8qIFdoZW4gdGhlIHNjb3JlIGdvZXMgb3ZlciAibGltaXQiIGl0IG1heSBhY3R1YWxseSBiZSBtdWNoIGhpZ2hlci4KKyAgICAgKiBSZXR1cm4gYSB2ZXJ5IGxhcmdlIG51bWJlciB0byBhdm9pZCBnb2luZyBiZWxvdyB0aGUgbGltaXQgd2hlbiBnaXZpbmcgYQorICAgICAqIGJvbnVzLiAqLworICAgIGlmIChtaW5zY29yZSA+IGxpbWl0KQorCXJldHVybiBTQ09SRV9NQVhNQVg7CisgICAgcmV0dXJuIG1pbnNjb3JlOworfQorCisjaWZkZWYgRkVBVF9NQllURQorLyoKKyAqIE11bHRpLWJ5dGUgdmVyc2lvbiBvZiBzcGVsbF9lZGl0X3Njb3JlX2xpbWl0KCkuCisgKiBLZWVwIGl0IGluIHN5bmMgd2l0aCB0aGUgYWJvdmUhCisgKi8KKyAgICBzdGF0aWMgaW50CitzcGVsbF9lZGl0X3Njb3JlX2xpbWl0X3coc2xhbmcsIGJhZHdvcmQsIGdvb2R3b3JkLCBsaW1pdCkKKyAgICBzbGFuZ19UCSpzbGFuZzsKKyAgICBjaGFyX3UJKmJhZHdvcmQ7CisgICAgY2hhcl91CSpnb29kd29yZDsKKyAgICBpbnQJCWxpbWl0OworeworICAgIGxpbWl0c2NvcmVfVCAgICBzdGFja1sxMF07CQkvKiBhbGxvdyBmb3Igb3ZlciAzICogMiBlZGl0cyAqLworICAgIGludAkJICAgIHN0YWNraWR4OworICAgIGludAkJICAgIGJpLCBnaTsKKyAgICBpbnQJCSAgICBiaTIsIGdpMjsKKyAgICBpbnQJCSAgICBiYywgZ2M7CisgICAgaW50CQkgICAgc2NvcmU7CisgICAgaW50CQkgICAgc2NvcmVfb2ZmOworICAgIGludAkJICAgIG1pbnNjb3JlOworICAgIGludAkJICAgIHJvdW5kOworICAgIGNoYXJfdQkgICAgKnA7CisgICAgaW50CQkgICAgd2JhZHdvcmRbTUFYV0xFTl07CisgICAgaW50CQkgICAgd2dvb2R3b3JkW01BWFdMRU5dOworCisgICAgLyogR2V0IHRoZSBjaGFyYWN0ZXJzIGZyb20gdGhlIG11bHRpLWJ5dGUgc3RyaW5ncyBhbmQgcHV0IHRoZW0gaW4gYW4KKyAgICAgKiBpbnQgYXJyYXkgZm9yIGVhc3kgYWNjZXNzLiAqLworICAgIGJpID0gMDsKKyAgICBmb3IgKHAgPSBiYWR3b3JkOyAqcCAhPSBOVUw7ICkKKwl3YmFkd29yZFtiaSsrXSA9IG1iX2NwdHIyY2hhcl9hZHYoJnApOworICAgIHdiYWR3b3JkW2JpKytdID0gMDsKKyAgICBnaSA9IDA7CisgICAgZm9yIChwID0gZ29vZHdvcmQ7ICpwICE9IE5VTDsgKQorCXdnb29kd29yZFtnaSsrXSA9IG1iX2NwdHIyY2hhcl9hZHYoJnApOworICAgIHdnb29kd29yZFtnaSsrXSA9IDA7CisKKyAgICAvKgorICAgICAqIFRoZSBpZGVhIGlzIHRvIGdvIGZyb20gc3RhcnQgdG8gZW5kIG92ZXIgdGhlIHdvcmRzLiAgU28gbG9uZyBhcworICAgICAqIGNoYXJhY3RlcnMgYXJlIGVxdWFsIGp1c3QgY29udGludWUsIHRoaXMgYWx3YXlzIGdpdmVzIHRoZSBsb3dlc3Qgc2NvcmUuCisgICAgICogV2hlbiB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgdHJ5IHNldmVyYWwgYWx0ZXJuYXRpdmVzLiAgRWFjaCBhbHRlcm5hdGl2ZQorICAgICAqIGluY3JlYXNlcyAic2NvcmUiIGZvciB0aGUgZWRpdCBkaXN0YW5jZS4gIFNvbWUgb2YgdGhlIGFsdGVybmF0aXZlcyBhcmUKKyAgICAgKiBwdXNoZWQgdW50byBhIHN0YWNrIGFuZCB0cmllZCBsYXRlciwgc29tZSBhcmUgdHJpZWQgcmlnaHQgYXdheS4gIEF0IHRoZQorICAgICAqIGVuZCBvZiB0aGUgd29yZCB0aGUgc2NvcmUgZm9yIG9uZSBhbHRlcm5hdGl2ZSBpcyBrbm93bi4gIFRoZSBsb3dlc3QKKyAgICAgKiBwb3NzaWJsZSBzY29yZSBpcyBzdG9yZWQgaW4gIm1pbnNjb3JlIi4KKyAgICAgKi8KKyAgICBzdGFja2lkeCA9IDA7CisgICAgYmkgPSAwOworICAgIGdpID0gMDsKKyAgICBzY29yZSA9IDA7CisgICAgbWluc2NvcmUgPSBsaW1pdCArIDE7CisKKyAgICBmb3IgKDs7KQorICAgIHsKKwkvKiBTa2lwIG92ZXIgYW4gZXF1YWwgcGFydCwgc2NvcmUgcmVtYWlucyB0aGUgc2FtZS4gKi8KKwlmb3IgKDs7KQorCXsKKwkgICAgYmMgPSB3YmFkd29yZFtiaV07CisJICAgIGdjID0gd2dvb2R3b3JkW2dpXTsKKworCSAgICBpZiAoYmMgIT0gZ2MpCS8qIHN0b3AgYXQgYSBjaGFyIHRoYXQncyBkaWZmZXJlbnQgKi8KKwkJYnJlYWs7CisJICAgIGlmIChiYyA9PSBOVUwpCS8qIGJvdGggd29yZHMgZW5kICovCisJICAgIHsKKwkJaWYgKHNjb3JlIDwgbWluc2NvcmUpCisJCSAgICBtaW5zY29yZSA9IHNjb3JlOworCQlnb3RvIHBvcDsJLyogZG8gbmV4dCBhbHRlcm5hdGl2ZSAqLworCSAgICB9CisJICAgICsrYmk7CisJICAgICsrZ2k7CisJfQorCisJaWYgKGdjID09IE5VTCkgICAgLyogZ29vZHdvcmQgZW5kcywgZGVsZXRlIGJhZHdvcmQgY2hhcnMgKi8KKwl7CisJICAgIGRvCisJICAgIHsKKwkJaWYgKChzY29yZSArPSBTQ09SRV9ERUwpID49IG1pbnNjb3JlKQorCQkgICAgZ290byBwb3A7CSAgICAvKiBkbyBuZXh0IGFsdGVybmF0aXZlICovCisJICAgIH0gd2hpbGUgKHdiYWR3b3JkWysrYmldICE9IE5VTCk7CisJICAgIG1pbnNjb3JlID0gc2NvcmU7CisJfQorCWVsc2UgaWYgKGJjID09IE5VTCkgLyogYmFkd29yZCBlbmRzLCBpbnNlcnQgYmFkd29yZCBjaGFycyAqLworCXsKKwkgICAgZG8KKwkgICAgeworCQlpZiAoKHNjb3JlICs9IFNDT1JFX0lOUykgPj0gbWluc2NvcmUpCisJCSAgICBnb3RvIHBvcDsJICAgIC8qIGRvIG5leHQgYWx0ZXJuYXRpdmUgKi8KKwkgICAgfSB3aGlsZSAod2dvb2R3b3JkWysrZ2ldICE9IE5VTCk7CisJICAgIG1pbnNjb3JlID0gc2NvcmU7CisJfQorCWVsc2UJCQkvKiBib3RoIHdvcmRzIGNvbnRpbnVlICovCisJeworCSAgICAvKiBJZiBub3QgY2xvc2UgdG8gdGhlIGxpbWl0LCBwZXJmb3JtIGEgY2hhbmdlLiAgT25seSB0cnkgY2hhbmdlcworCSAgICAgKiB0aGF0IG1heSBsZWFkIHRvIGEgbG93ZXIgc2NvcmUgdGhhbiAibWluc2NvcmUiLgorCSAgICAgKiByb3VuZCAwOiB0cnkgZGVsZXRpbmcgYSBjaGFyIGZyb20gYmFkd29yZAorCSAgICAgKiByb3VuZCAxOiB0cnkgaW5zZXJ0aW5nIGEgY2hhciBpbiBiYWR3b3JkICovCisJICAgIGZvciAocm91bmQgPSAwOyByb3VuZCA8PSAxOyArK3JvdW5kKQorCSAgICB7CisJCXNjb3JlX29mZiA9IHNjb3JlICsgKHJvdW5kID09IDAgPyBTQ09SRV9ERUwgOiBTQ09SRV9JTlMpOworCQlpZiAoc2NvcmVfb2ZmIDwgbWluc2NvcmUpCisJCXsKKwkJICAgIGlmIChzY29yZV9vZmYgKyBTQ09SRV9FRElUX01JTiA+PSBtaW5zY29yZSkKKwkJICAgIHsKKwkJCS8qIE5lYXIgdGhlIGxpbWl0LCByZXN0IG9mIHRoZSB3b3JkcyBtdXN0IG1hdGNoLiAgV2UKKwkJCSAqIGNhbiBjaGVjayB0aGF0IHJpZ2h0IG5vdywgbm8gbmVlZCB0byBwdXNoIGFuIGl0ZW0KKwkJCSAqIG9udG8gdGhlIHN0YWNrLiAqLworCQkJYmkyID0gYmkgKyAxIC0gcm91bmQ7CisJCQlnaTIgPSBnaSArIHJvdW5kOworCQkJd2hpbGUgKHdnb29kd29yZFtnaTJdID09IHdiYWR3b3JkW2JpMl0pCisJCQl7CisJCQkgICAgaWYgKHdnb29kd29yZFtnaTJdID09IE5VTCkKKwkJCSAgICB7CisJCQkJbWluc2NvcmUgPSBzY29yZV9vZmY7CisJCQkJYnJlYWs7CisJCQkgICAgfQorCQkJICAgICsrYmkyOworCQkJICAgICsrZ2kyOworCQkJfQorCQkgICAgfQorCQkgICAgZWxzZQorCQkgICAgeworCQkJLyogdHJ5IGRlbGV0aW5nIGEgY2hhcmFjdGVyIGZyb20gYmFkd29yZCBsYXRlciAqLworCQkJc3RhY2tbc3RhY2tpZHhdLmJhZGkgPSBiaSArIDEgLSByb3VuZDsKKwkJCXN0YWNrW3N0YWNraWR4XS5nb29kaSA9IGdpICsgcm91bmQ7CisJCQlzdGFja1tzdGFja2lkeF0uc2NvcmUgPSBzY29yZV9vZmY7CisJCQkrK3N0YWNraWR4OworCQkgICAgfQorCQl9CisJICAgIH0KKworCSAgICBpZiAoc2NvcmUgKyBTQ09SRV9TV0FQIDwgbWluc2NvcmUpCisJICAgIHsKKwkJLyogSWYgc3dhcHBpbmcgdHdvIGNoYXJhY3RlcnMgbWFrZXMgYSBtYXRjaCB0aGVuIHRoZQorCQkgKiBzdWJzdGl0dXRpb24gaXMgbW9yZSBleHBlbnNpdmUsIHRodXMgdGhlcmUgaXMgbm8gbmVlZCB0bworCQkgKiB0cnkgYm90aC4gKi8KKwkJaWYgKGdjID09IHdiYWR3b3JkW2JpICsgMV0gJiYgYmMgPT0gd2dvb2R3b3JkW2dpICsgMV0pCisJCXsKKwkJICAgIC8qIFN3YXAgdHdvIGNoYXJhY3RlcnMsIHRoYXQgaXM6IHNraXAgdGhlbS4gKi8KKwkJICAgIGdpICs9IDI7CisJCSAgICBiaSArPSAyOworCQkgICAgc2NvcmUgKz0gU0NPUkVfU1dBUDsKKwkJICAgIGNvbnRpbnVlOworCQl9CisJICAgIH0KKworCSAgICAvKiBTdWJzdGl0dXRlIG9uZSBjaGFyYWN0ZXIgZm9yIGFub3RoZXIgd2hpY2ggaXMgdGhlIHNhbWUKKwkgICAgICogdGhpbmcgYXMgZGVsZXRpbmcgYSBjaGFyYWN0ZXIgZnJvbSBib3RoIGdvb2R3b3JkIGFuZCBiYWR3b3JkLgorCSAgICAgKiBVc2UgYSBiZXR0ZXIgc2NvcmUgd2hlbiB0aGVyZSBpcyBvbmx5IGEgY2FzZSBkaWZmZXJlbmNlLiAqLworCSAgICBpZiAoU1BFTExfVE9GT0xEKGJjKSA9PSBTUEVMTF9UT0ZPTEQoZ2MpKQorCQlzY29yZSArPSBTQ09SRV9JQ0FTRTsKKwkgICAgZWxzZQorCSAgICB7CisJCS8qIEZvciBhIHNpbWlsYXIgY2hhcmFjdGVyIHVzZSBTQ09SRV9TSU1JTEFSLiAqLworCQlpZiAoc2xhbmcgIT0gTlVMTAorCQkJJiYgc2xhbmctPnNsX2hhc19tYXAKKwkJCSYmIHNpbWlsYXJfY2hhcnMoc2xhbmcsIGdjLCBiYykpCisJCSAgICBzY29yZSArPSBTQ09SRV9TSU1JTEFSOworCQllbHNlCisJCSAgICBzY29yZSArPSBTQ09SRV9TVUJTVDsKKwkgICAgfQorCisJICAgIGlmIChzY29yZSA8IG1pbnNjb3JlKQorCSAgICB7CisJCS8qIERvIHRoZSBzdWJzdGl0dXRpb24uICovCisJCSsrZ2k7CisJCSsrYmk7CisJCWNvbnRpbnVlOworCSAgICB9CisJfQorcG9wOgorCS8qCisJICogR2V0IGhlcmUgdG8gdHJ5IHRoZSBuZXh0IGFsdGVybmF0aXZlLCBwb3AgaXQgZnJvbSB0aGUgc3RhY2suCisJICovCisJaWYgKHN0YWNraWR4ID09IDApCQkvKiBzdGFjayBpcyBlbXB0eSwgZmluaXNoZWQgKi8KKwkgICAgYnJlYWs7CisKKwkvKiBwb3AgYW4gaXRlbSBmcm9tIHRoZSBzdGFjayAqLworCS0tc3RhY2tpZHg7CisJZ2kgPSBzdGFja1tzdGFja2lkeF0uZ29vZGk7CisJYmkgPSBzdGFja1tzdGFja2lkeF0uYmFkaTsKKwlzY29yZSA9IHN0YWNrW3N0YWNraWR4XS5zY29yZTsKKyAgICB9CisKKyAgICAvKiBXaGVuIHRoZSBzY29yZSBnb2VzIG92ZXIgImxpbWl0IiBpdCBtYXkgYWN0dWFsbHkgYmUgbXVjaCBoaWdoZXIuCisgICAgICogUmV0dXJuIGEgdmVyeSBsYXJnZSBudW1iZXIgdG8gYXZvaWQgZ29pbmcgYmVsb3cgdGhlIGxpbWl0IHdoZW4gZ2l2aW5nIGEKKyAgICAgKiBib251cy4gKi8KKyAgICBpZiAobWluc2NvcmUgPiBsaW1pdCkKKwlyZXR1cm4gU0NPUkVfTUFYTUFYOworICAgIHJldHVybiBtaW5zY29yZTsKK30KKyNlbmRpZgorCisjZGVmaW5lIERVTVBGTEFHX0tFRVBDQVNFICAgMQkvKiByb3VuZCAyOiBrZWVwLWNhc2UgdHJlZSAqLworI2RlZmluZSBEVU1QRkxBR19DT1VOVAkgICAgMgkvKiBpbmNsdWRlIHdvcmQgY291bnQgKi8KKwogLyoKICAqICI6c3BlbGxkdW1wIgogICovCkBAIC0xMjYwMyw2ICsxNDY1NCw3IEBACiAgICAgaW50CQlkb19yZWdpb24gPSBUUlVFOwkgICAgLyogZHVtcCByZWdpb24gbmFtZXMgYW5kIG51bWJlcnMgKi8KICAgICBjaGFyX3UJKnA7CiAgICAgaW50CQlscGk7CisgICAgaW50CQlkdW1wZmxhZ3M7CiAKICAgICBpZiAobm9fc3BlbGxfY2hlY2tpbmcoY3Vyd2luKSkKIAlyZXR1cm47CkBAIC0xMjY1NywxNyArMTQ3MDksMjIgQEAKIAl7CiAJICAgIGlmIChyb3VuZCA9PSAxKQogCSAgICB7CisJCWR1bXBmbGFncyA9IDA7CiAJCWJ5dHMgPSBzbGFuZy0+c2xfZmJ5dHM7CiAJCWlkeHMgPSBzbGFuZy0+c2xfZmlkeHM7CiAJICAgIH0KIAkgICAgZWxzZQogCSAgICB7CisJCWR1bXBmbGFncyA9IERVTVBGTEFHX0tFRVBDQVNFOwogCQlieXRzID0gc2xhbmctPnNsX2tieXRzOwogCQlpZHhzID0gc2xhbmctPnNsX2tpZHhzOwogCSAgICB9CiAJICAgIGlmIChieXRzID09IE5VTEwpCiAJCWNvbnRpbnVlOwkJLyogYXJyYXkgaXMgZW1wdHkgKi8KIAorCSAgICBpZiAoZWFwLT5mb3JjZWl0KQorCQlkdW1wZmxhZ3MgfD0gRFVNUEZMQUdfQ09VTlQ7CisKIAkgICAgZGVwdGggPSAwOwogCSAgICBhcnJpZHhbMF0gPSAwOwogCSAgICBjdXJpWzBdID0gMTsKQEAgLTEyNzA3LDExICsxNDc2NCwxMiBAQAogCQkJICAgICAqIHdoZW4gaXQncyB0aGUgZmlyc3Qgb25lLiAqLwogCQkJICAgIGMgPSAodW5zaWduZWQpZmxhZ3MgPj4gMjQ7CiAJCQkgICAgaWYgKGMgPT0gMCB8fCBjdXJpW2RlcHRoXSA9PSAyKQotCQkJCWR1bXBfd29yZCh3b3JkLCByb3VuZCwgZmxhZ3MsIGxudW0rKyk7CisJCQkJZHVtcF93b3JkKHNsYW5nLCB3b3JkLCBkdW1wZmxhZ3MsCisJCQkJCQkJICAgICAgIGZsYWdzLCBsbnVtKyspOwogCiAJCQkgICAgLyogQXBwbHkgdGhlIHByZWZpeCwgaWYgdGhlcmUgaXMgb25lLiAqLwogCQkJICAgIGlmIChjICE9IDApCi0JCQkJbG51bSA9IGR1bXBfcHJlZml4ZXMoc2xhbmcsIHdvcmQsIHJvdW5kLAorCQkJCWxudW0gPSBkdW1wX3ByZWZpeGVzKHNsYW5nLCB3b3JkLCBkdW1wZmxhZ3MsCiAJCQkJCQkJCSBmbGFncywgbG51bSk7CiAJCQl9CiAJCSAgICB9CkBAIC0xMjczOCwxOSArMTQ3OTYsMjEgQEAKICAqIER1bXAgb25lIHdvcmQ6IGFwcGx5IGNhc2UgbW9kaWZpY2F0aW9ucyBhbmQgYXBwZW5kIGEgbGluZSB0byB0aGUgYnVmZmVyLgogICovCiAgICAgc3RhdGljIHZvaWQKLWR1bXBfd29yZCh3b3JkLCByb3VuZCwgZmxhZ3MsIGxudW0pCitkdW1wX3dvcmQoc2xhbmcsIHdvcmQsIGR1bXBmbGFncywgZmxhZ3MsIGxudW0pCisgICAgc2xhbmdfVAkqc2xhbmc7CiAgICAgY2hhcl91CSp3b3JkOwotICAgIGludAkJcm91bmQ7CisgICAgaW50CQlkdW1wZmxhZ3M7CiAgICAgaW50CQlmbGFnczsKICAgICBsaW5lbnJfVAlsbnVtOwogewogICAgIGludAkJa2VlcGNhcCA9IEZBTFNFOwogICAgIGNoYXJfdQkqcDsKKyAgICBjaGFyX3UJKnR3OwogICAgIGNoYXJfdQljd29yZFtNQVhXTEVOXTsKICAgICBjaGFyX3UJYmFkd29yZFtNQVhXTEVOICsgMTBdOwogICAgIGludAkJaTsKIAotICAgIGlmIChyb3VuZCA9PSAxICYmIChmbGFncyAmIFdGX0NBUE1BU0spICE9IDApCisgICAgaWYgKChkdW1wZmxhZ3MgJiBEVU1QRkxBR19LRUVQQ0FTRSkgPT0gMCAmJiAoZmxhZ3MgJiBXRl9DQVBNQVNLKSAhPSAwKQogICAgIHsKIAkvKiBOZWVkIHRvIGZpeCBjYXNlIGFjY29yZGluZyB0byAiZmxhZ3MiLiAqLwogCW1ha2VfY2FzZV93b3JkKHdvcmQsIGN3b3JkLCBmbGFncyk7CkBAIC0xMjc1OSwxMCArMTQ4MTksMTIgQEAKICAgICBlbHNlCiAgICAgewogCXAgPSB3b3JkOwotCWlmIChyb3VuZCA9PSAyICYmICgoY2FwdHlwZSh3b3JkLCBOVUxMKSAmIFdGX0tFRVBDQVApID09IDAKKwlpZiAoKGR1bXBmbGFncyAmIERVTVBGTEFHX0tFRVBDQVNFKQorCQkmJiAoKGNhcHR5cGUod29yZCwgTlVMTCkgJiBXRl9LRUVQQ0FQKSA9PSAwCiAJCQkJCQkgfHwgKGZsYWdzICYgV0ZfRklYQ0FQKSAhPSAwKSkKIAkgICAga2VlcGNhcCA9IFRSVUU7CiAgICAgfQorICAgIHR3ID0gcDsKIAogICAgIC8qIEFkZCBmbGFncyBhbmQgcmVnaW9ucyBhZnRlciBhIHNsYXNoLiAqLwogICAgIGlmICgoZmxhZ3MgJiAoV0ZfQkFOTkVEIHwgV0ZfUkFSRSB8IFdGX1JFR0lPTikpIHx8IGtlZXBjYXApCkBAIC0xMjc4Miw2ICsxNDg0NCwyMCBAQAogCXAgPSBiYWR3b3JkOwogICAgIH0KIAorICAgIGlmIChkdW1wZmxhZ3MgJiBEVU1QRkxBR19DT1VOVCkKKyAgICB7CisJaGFzaGl0ZW1fVCAgKmhpOworCisJLyogSW5jbHVkZSB0aGUgd29yZCBjb3VudCBmb3IgIjpzcGVsbGR1bXAhIi4gKi8KKwloaSA9IGhhc2hfZmluZCgmc2xhbmctPnNsX3dvcmRjb3VudCwgdHcpOworCWlmICghSEFTSElURU1fRU1QVFkoaGkpKQorCXsKKwkgICAgdmltX3NucHJpbnRmKChjaGFyICopSU9idWZmLCBJT1NJWkUsICIlc1x0JWQiLAorCQkJCQkJICAgICB0dywgSEkyV0MoaGkpLT53Y19jb3VudCk7CisJICAgIHAgPSBJT2J1ZmY7CisJfQorICAgIH0KKwogICAgIG1sX2FwcGVuZChsbnVtLCBwLCAoY29sbnJfVCkwLCBGQUxTRSk7CiB9CiAKQEAgLTEyNzkxLDEwICsxNDg2NywxMCBAQAogICogUmV0dXJuIHRoZSB1cGRhdGVkIGxpbmUgbnVtYmVyLgogICovCiAgICAgc3RhdGljIGxpbmVucl9UCi1kdW1wX3ByZWZpeGVzKHNsYW5nLCB3b3JkLCByb3VuZCwgZmxhZ3MsIHN0YXJ0bG51bSkKK2R1bXBfcHJlZml4ZXMoc2xhbmcsIHdvcmQsIGR1bXBmbGFncywgZmxhZ3MsIHN0YXJ0bG51bSkKICAgICBzbGFuZ19UCSpzbGFuZzsKICAgICBjaGFyX3UJKndvcmQ7CSAgICAvKiBjYXNlLWZvbGRlZCB3b3JkICovCi0gICAgaW50CQlyb3VuZDsKKyAgICBpbnQJCWR1bXBmbGFnczsKICAgICBpbnQJCWZsYWdzOwkgICAgLyogZmxhZ3Mgd2l0aCBwcmVmaXggSUQgKi8KICAgICBsaW5lbnJfVAlzdGFydGxudW07CiB7CkBAIC0xMjg2MCw3ICsxNDkzNiw3IEBACiAJCSAgICBpZiAoYyAhPSAwKQogCQkgICAgewogCQkJdmltX3N0cm5jcHkocHJlZml4ICsgZGVwdGgsIHdvcmQsIE1BWFdMRU4gLSBkZXB0aCAtIDEpOwotCQkJZHVtcF93b3JkKHByZWZpeCwgcm91bmQsCisJCQlkdW1wX3dvcmQoc2xhbmcsIHByZWZpeCwgZHVtcGZsYWdzLAogCQkJCShjICYgV0ZfUkFSRVBGWCkgPyAoZmxhZ3MgfCBXRl9SQVJFKQogCQkJCQkJCSAgICAgOiBmbGFncywgbG51bSsrKTsKIAkJICAgIH0KQEAgLTEyODc2LDcgKzE0OTUyLDcgQEAKIAkJCXsKIAkJCSAgICB2aW1fc3RybmNweShwcmVmaXggKyBkZXB0aCwgd29yZF91cCwKIAkJCQkJCQkgTUFYV0xFTiAtIGRlcHRoIC0gMSk7Ci0JCQkgICAgZHVtcF93b3JkKHByZWZpeCwgcm91bmQsCisJCQkgICAgZHVtcF93b3JkKHNsYW5nLCBwcmVmaXgsIGR1bXBmbGFncywKIAkJCQkgICAgKGMgJiBXRl9SQVJFUEZYKSA/IChmbGFncyB8IFdGX1JBUkUpCiAJCQkJCQkJICAgICA6IGZsYWdzLCBsbnVtKyspOwogCQkJfQpAQCAtMTI5ODEsNyArMTUwNTcsNyBAQAogewogICAgIGdhcnJheV9UCWdhOwogCi0gICAgc3BlbGxfc3VnZ2VzdF9saXN0KCZnYSwgcGF0LCAxMDAsIHNwZWxsX2V4cGFuZF9uZWVkX2NhcCk7CisgICAgc3BlbGxfc3VnZ2VzdF9saXN0KCZnYSwgcGF0LCAxMDAsIHNwZWxsX2V4cGFuZF9uZWVkX2NhcCwgVFJVRSk7CiAgICAgKm1hdGNocCA9IGdhLmdhX2RhdGE7CiAgICAgcmV0dXJuIGdhLmdhX2xlbjsKIH0KZGlmZiAtLWdpdCBhL3NyYy9zdHJ1Y3RzLmggYi9zcmMvc3RydWN0cy5oCmluZGV4IDViOTFjZWMuLjU0MjBiNGUgMTAwNjQ0Ci0tLSBhL3NyYy9zdHJ1Y3RzLmgKKysrIGIvc3JjL3N0cnVjdHMuaApAQCAtMTA3NCw2ICsxMDc0LDEzIEBACiAjZGVmaW5lIFNZTlNQTF9UT1AJMQkvKiBzcGVsbCBjaGVjayB0b3BsZXZlbCB0ZXh0ICovCiAjZGVmaW5lIFNZTlNQTF9OT1RPUAkyCS8qIGRvbid0IHNwZWxsIGNoZWNrIHRvcGxldmVsIHRleHQgKi8KIAorLyogYXZvaWQgI2lmZGVmcyBmb3Igd2hlbiBiX3NwZWxsIGlzIG5vdCBhdmFpbGFibGUgKi8KKyNpZmRlZiBGRUFUX1NZTl9ITAorIyBkZWZpbmUgQl9TUEVMTChidWYpICAoKGJ1ZiktPmJfc3BlbGwpCisjZWxzZQorIyBkZWZpbmUgQl9TUEVMTChidWYpICAoMCkKKyNlbmRpZgorCiAKIC8qCiAgKiBidWZmZXI6IHN0cnVjdHVyZSB0aGF0IGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IG9uZSBmaWxlCkBAIC0xNDA3LDggKzE0MTQsMTkgQEAKICAgICBpbnQJCWJfbWF5X3N3YXA7CiAgICAgaW50CQliX2RpZF93YXJuOwkvKiBTZXQgdG8gMSBpZiB1c2VyIGhhcyBiZWVuIHdhcm5lZCBvbiBmaXJzdAogCQkJCSAgIGNoYW5nZSBvZiBhIHJlYWQtb25seSBmaWxlICovCi0gICAgaW50CQliX2hlbHA7CQkvKiBidWZmZXIgZm9yIGhlbHAgZmlsZSAod2hlbiBzZXQgYl9wX2J0IGlzCi0JCQkJICAgImhlbHAiKSAqLworCisgICAgLyogVHdvIHNwZWNpYWwga2luZHMgb2YgYnVmZmVyczoKKyAgICAgKiBoZWxwIGJ1ZmZlciAgLSB1c2VkIGZvciBoZWxwIGZpbGVzLCB3b24ndCB1c2UgYSBzd2FwIGZpbGUuCisgICAgICogc3BlbGwgYnVmZmVyIC0gdXNlZCBmb3Igc3BlbGwgaW5mbywgbmV2ZXIgZGlzcGxheWVkIGFuZCBkb2Vzbid0IGhhdmUgYQorICAgICAqCQkgICAgICBmaWxlIG5hbWUuCisgICAgICovCisgICAgaW50CQliX2hlbHA7CQkvKiBUUlVFIGZvciBoZWxwIGZpbGUgYnVmZmVyICh3aGVuIHNldCBiX3BfYnQKKwkJCQkgICBpcyAiaGVscCIpICovCisjaWZkZWYgRkVBVF9TWU5fSEwKKyAgICBpbnQJCWJfc3BlbGw7CS8qIFRSVUUgZm9yIGEgc3BlbGwgZmlsZSBidWZmZXIsIG1vc3QgZmllbGRzCisJCQkJICAgYXJlIG5vdCB1c2VkISAgVXNlIHRoZSBCX1NQRUxMIG1hY3JvIHRvCisJCQkJICAgYWNjZXNzIGJfc3BlbGwgd2l0aG91dCAjaWZkZWYuICovCisjZW5kaWYKIAogI2lmbmRlZiBTSE9SVF9GTkFNRQogICAgIGludAkJYl9zaG9ydG5hbWU7CS8qIHRoaXMgZmlsZSBoYXMgYW4gOC4zIGZpbGUgbmFtZSAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RkaXIvdGVzdDU4Lm9rIGIvc3JjL3Rlc3RkaXIvdGVzdDU4Lm9rCmluZGV4IDc1Y2FhN2UuLmI3ZWQwOTQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0ZGlyL3Rlc3Q1OC5vaworKysgYi9zcmMvdGVzdGRpci90ZXN0NTgub2sKQEAgLTIwLDExICsyMCwxMSBAQAogd3JvbmcKIC0tLS0tLS0KIGJhZAotWydwdXQnLCAnT0snLCAndWsnXQorWydwdXQnLCAndWsnLCAnT0snXQogaW5wdXRzCiBbJ2lucHV0JywgJ3B1dHMnLCAnb3V0cHV0cyddCiBjb21tZW50Ci1bJ0NvbW1lbnQnXQorWydDb21tZW50JywgJ291dHRlc3QnLCAndGhlIGVuZCddCiBvawogWydPSycsICd1aycsICdwdXQnXQogT2sKQEAgLTM0LDcgKzM0LDcgQEAKIGTp9GwKIFsnZGVvbCcsICdk6fRyJywgJ3Rlc3QnXQogZW5kCi1bJ3B1dCcsICdPSycsICd0ZXN0J10KK1sncHV0JywgJ3VrJywgJ3Rlc3QnXQogdGhlCiBbJ3B1dCcsICd1aycsICd0ZXN0J10KIGdlYmxldGVnZWsKQEAgLTE0MSw3ICsxNDEsNyBAQAogd29yZHV0aWxpemUKIFsnd29yZCB1dGlsaXplJywgJ3dvcmR1dGlscycsICd3b3JkdXRpbCddCiBwcm8KLVsnYm9yaycsICdlbmQnLCAnd29yZCddCitbJ2JvcmsnLCAnd29yZCcsICdlbmQnXQogYm9ya2Jvcmtib3JrYm9ya2Jvcmtib3JrCiBbJ2JvcmsgYm9ya2Jvcmtib3JrYm9ya2JvcmsnLCAnYm9ya2JvcmsgYm9ya2Jvcmtib3JrYm9yaycsICdib3JrYm9ya2JvcmsgYm9ya2Jvcmtib3JrJ10KIHRvbWF0b3RvbWF0b3RvbWF0bwpAQCAtMTg1LDcgKzE4NSw3IEBACiBtaWRkbGUKIFtdCiBzdGFydG1pZGRsZQotWydzdGFydG1pZGRsZWVuZCddCitbJ3N0YXJ0bWlkZGxlZW5kJywgJ3N0YXJ0bWlkZGxlYmFyJ10KIG1pZGRsZWVuZAogW10KIGVuZHN0YXJ0CkBAIC0yMTcsNyArMjE3LDcgQEAKIG1pZGRsZQogW10KIGxlYWRtaWRkbGUKLVsnbGVhZG1pZGRsZWVuZCddCitbJ2xlYWRtaWRkbGVlbmQnLCAnbGVhZG1pZGRsZWJhciddCiBtaWRkbGVlbmQKIFtdCiBlbmRsZWFkCkBAIC0yNDksNyArMjQ5LDcgQEAKIG1pZGRsZQogW10KIGxlYWRtaWRkbGUKLVtdCitbJ2xlYWRtaWRkbGViYXInXQogbWlkZGxldGFpbAogW10KIHRhaWxsZWFkCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0NTkub2sgYi9zcmMvdGVzdGRpci90ZXN0NTkub2sKaW5kZXggOWM0OWJlNC4uMjljOTY5NiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RkaXIvdGVzdDU5Lm9rCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3Q1OS5vawpAQCAtMjAsMTEgKzIwLDExIEBACiB3cm9uZwogLS0tLS0tLQogYmFkCi1bJ3B1dCcsICdPSycsICd1ayddCitbJ3B1dCcsICd1aycsICdPSyddCiBpbnB1dHMKIFsnaW5wdXQnLCAncHV0cycsICdvdXRwdXRzJ10KIGNvbW1lbnQKLVsnQ29tbWVudCddCitbJ0NvbW1lbnQnLCAnb3V0dGVzdCcsICd0aGUgZW5kJ10KIG9rCiBbJ09LJywgJ3VrJywgJ3B1dCddCiBPawpAQCAtMzQsNyArMzQsNyBAQAogZMOpw7RsCiBbJ2Rlb2wnLCAnZMOpw7RyJywgJ3Rlc3QnXQogZW5kCi1bJ3B1dCcsICdPSycsICd0ZXN0J10KK1sncHV0JywgJ3VrJywgJ3Rlc3QnXQogdGhlCiBbJ3B1dCcsICd1aycsICd0ZXN0J10KIGdlYmxldGVnZWsKQEAgLTE0MSw3ICsxNDEsNyBAQAogd29yZHV0aWxpemUKIFsnd29yZCB1dGlsaXplJywgJ3dvcmR1dGlscycsICd3b3JkdXRpbCddCiBwcm8KLVsnYm9yaycsICdlbmQnLCAnd29yZCddCitbJ2JvcmsnLCAnd29yZCcsICdlbmQnXQogYm9ya2Jvcmtib3JrYm9ya2Jvcmtib3JrCiBbJ2JvcmsgYm9ya2Jvcmtib3JrYm9ya2JvcmsnLCAnYm9ya2JvcmsgYm9ya2Jvcmtib3JrYm9yaycsICdib3JrYm9ya2JvcmsgYm9ya2Jvcmtib3JrJ10KIHRvbWF0b3RvbWF0b3RvbWF0bwpAQCAtMTg1LDcgKzE4NSw3IEBACiBtaWRkbGUKIFtdCiBzdGFydG1pZGRsZQotWydzdGFydG1pZGRsZWVuZCddCitbJ3N0YXJ0bWlkZGxlZW5kJywgJ3N0YXJ0bWlkZGxlYmFyJ10KIG1pZGRsZWVuZAogW10KIGVuZHN0YXJ0CkBAIC0yMTcsNyArMjE3LDcgQEAKIG1pZGRsZQogW10KIGxlYWRtaWRkbGUKLVsnbGVhZG1pZGRsZWVuZCddCitbJ2xlYWRtaWRkbGVlbmQnLCAnbGVhZG1pZGRsZWJhciddCiBtaWRkbGVlbmQKIFtdCiBlbmRsZWFkCkBAIC0yNDksNyArMjQ5LDcgQEAKIG1pZGRsZQogW10KIGxlYWRtaWRkbGUKLVtdCitbJ2xlYWRtaWRkbGViYXInXQogbWlkZGxldGFpbAogW10KIHRhaWxsZWFkCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0NjAuaW4gYi9zcmMvdGVzdGRpci90ZXN0NjAuaW4KaW5kZXggOTg5OWE5NC4uMmM0MTRiMyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RkaXIvdGVzdDYwLmluCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3Q2MC5pbgpAQCAtNTEsNiArNTEsMTAgQEAKICAgICBsZXQgdGVzdF9jYXNlcyArPSBbWycmdGV4dHdpZHRoJywgMV1dCiAgICAgIiBFeGlzdGluZyBhbmQgd29ya2luZyBvcHRpb24gKHNob3J0IGZvcm0pCiAgICAgbGV0IHRlc3RfY2FzZXMgKz0gW1snJnR3JywgMV1dCisgICAgIiBHbG9iYWwgb3B0aW9uCisgICAgbGV0IHRlc3RfY2FzZXMgKz0gW1snJmc6ZXJyb3Jmb3JtYXQnLCAxXV0KKyAgICAiIExvY2FsIG9wdGlvbgorICAgIGxldCB0ZXN0X2Nhc2VzICs9IFtbJyZsOmVycm9yZm9ybWF0JywgMV1dCiAgICAgIiBOZWdhdGl2ZSBmb3JtIG9mIGV4aXN0aW5nIGFuZCB3b3JraW5nIG9wdGlvbiAobG9uZyBmb3JtKQogICAgIGxldCB0ZXN0X2Nhc2VzICs9IFtbJyZub2pvaW5zcGFjZXMnLCAwXV0KICAgICAiIE5lZ2F0aXZlIGZvcm0gb2YgZXhpc3RpbmcgYW5kIHdvcmtpbmcgb3B0aW9uIChzaG9ydCBmb3JtKQpAQCAtMjEyLDYgKzIxNiwyNiBAQAogCWVjaG8gIkZBSUxFRCIKICAgICBlbmRpZgogCisgICAgIiBFeGlzdGluZyBsb2NhbCBjdXJseS1icmFjZSB2YXJpYWJsZQorICAgIGxldCBzdHIgPSAibG9jYWwiCisgICAgbGV0IGN1cmx5X3tzdHJ9X3ZhciA9IDEKKyAgICBlY2hvICdjdXJseV8nIC4gc3RyIC4gJ192YXI6IDEnCisgICAgaWYgZXhpc3RzKCdjdXJseV97c3RyfV92YXInKQorCWVjaG8gIk9LIgorICAgIGVsc2UKKwllY2hvICJGQUlMRUQiCisgICAgZW5kaWYKKworICAgICIgTm9uLWV4aXN0aW5nIGxvY2FsIGN1cmx5LWJyYWNlIHZhcmlhYmxlCisgICAgdW5sZXQgY3VybHlfe3N0cn1fdmFyCisgICAgZWNobyAnY3VybHlfJyAuIHN0ciAuICdfdmFyOiAwJworICAgIGlmICFleGlzdHMoJ2N1cmx5X3tzdHJ9X3ZhcicpCisJZWNobyAiT0siCisgICAgZWxzZQorCWVjaG8gIkZBSUxFRCIKKyAgICBlbmRpZgorCisKICAgICAiIEV4aXN0aW5nIGdsb2JhbCB2YXJpYWJsZQogICAgIGxldCBnOmdsb2JhbF92YXIgPSAxCiAgICAgZWNobyAnZzpnbG9iYWxfdmFyOiAxJwpAQCAtMjMwLDI5ICsyNTQsNDYgQEAKIAllY2hvICJGQUlMRUQiCiAgICAgZW5kaWYKIAotICAgICIgRXhpc3RpbmcgbG9jYWwgY3VybHktYnJhY2UgdmFyaWFibGUKLSAgICBsZXQgY3VybHlfbG9jYWxfdmFyID0gMQotICAgIGxldCBzdHIgPSAibG9jYWwiCi0gICAgZWNobyAnY3VybHlfe3N0cn1fdmFyOiAxJwotICAgIGlmIGV4aXN0cygnY3VybHlfe3N0cn1fdmFyJykKKyAgICAiIEV4aXN0aW5nIGdsb2JhbCBsaXN0CisgICAgbGV0IGc6Z2xvYmFsX2xpc3QgPSBbImJsdWUiLCAib3JhbmdlIl0KKyAgICBlY2hvICdnOmdsb2JhbF9saXN0OiAxJworICAgIGlmIGV4aXN0cygnZzpnbG9iYWxfbGlzdCcpCiAJZWNobyAiT0siCiAgICAgZWxzZQogCWVjaG8gIkZBSUxFRCIKICAgICBlbmRpZgogCi0gICAgIiBOb24tZXhpc3RpbmcgbG9jYWwgY3VybHktYnJhY2UgdmFyaWFibGUKLSAgICB1bmxldCBjdXJseV9sb2NhbF92YXIKLSAgICBlY2hvICdjdXJseV97c3RyfV92YXI6IDAnCi0gICAgaWYgIWV4aXN0cygnY3VybHlfe3N0cn1fdmFyJykKKyAgICAiIE5vbi1leGlzdGluZyBnbG9iYWwgbGlzdAorICAgIHVubGV0IGc6Z2xvYmFsX2xpc3QKKyAgICBlY2hvICdnOmdsb2JhbF9saXN0OiAwJworICAgIGlmICFleGlzdHMoJ2c6Z2xvYmFsX2xpc3QnKQorCWVjaG8gIk9LIgorICAgIGVsc2UKKwllY2hvICJGQUlMRUQiCisgICAgZW5kaWYKKworICAgICIgRXhpc3RpbmcgZ2xvYmFsIGRpY3Rpb25hcnkKKyAgICBsZXQgZzpnbG9iYWxfZGljdCA9IHsieGNvcmQiOjEwMCwgInljb3JkIjoyfQorICAgIGVjaG8gJ2c6Z2xvYmFsX2RpY3Q6IDEnCisgICAgaWYgZXhpc3RzKCdnOmdsb2JhbF9kaWN0JykKKwllY2hvICJPSyIKKyAgICBlbHNlCisJZWNobyAiRkFJTEVEIgorICAgIGVuZGlmCisKKyAgICAiIE5vbi1leGlzdGluZyBnbG9iYWwgZGljdGlvbmFyeQorICAgIHVubGV0IGc6Z2xvYmFsX2RpY3QKKyAgICBlY2hvICdnOmdsb2JhbF9kaWN0OiAwJworICAgIGlmICFleGlzdHMoJ2c6Z2xvYmFsX2RpY3QnKQogCWVjaG8gIk9LIgogICAgIGVsc2UKIAllY2hvICJGQUlMRUQiCiAgICAgZW5kaWYKIAogICAgICIgRXhpc3RpbmcgZ2xvYmFsIGN1cmx5LWJyYWNlIHZhcmlhYmxlCi0gICAgbGV0IGc6Y3VybHlfZ2xvYmFsX3ZhciA9IDEKICAgICBsZXQgc3RyID0gImdsb2JhbCIKLSAgICBlY2hvICdnOmN1cmx5X3tzdHJ9X3ZhcjogMScKKyAgICBsZXQgZzpjdXJseV97c3RyfV92YXIgPSAxCisgICAgZWNobyAnZzpjdXJseV8nIC4gc3RyIC4gJ192YXI6IDEnCiAgICAgaWYgZXhpc3RzKCdnOmN1cmx5X3tzdHJ9X3ZhcicpCiAJZWNobyAiT0siCiAgICAgZWxzZQpAQCAtMjYwLDE3ICszMDEsMjEyIEBACiAgICAgZW5kaWYKIAogICAgICIgTm9uLWV4aXN0aW5nIGdsb2JhbCBjdXJseS1icmFjZSB2YXJpYWJsZQotICAgIHVubGV0IGc6Y3VybHlfZ2xvYmFsX3ZhcgotICAgIGVjaG8gJ2c6Y3VybHlfe3N0cn1fdmFyOiAwJworICAgIHVubGV0IGc6Y3VybHlfe3N0cn1fdmFyCisgICAgZWNobyAnZzpjdXJseV8nIC4gc3RyIC4gJ192YXI6IDAnCiAgICAgaWYgIWV4aXN0cygnZzpjdXJseV97c3RyfV92YXInKQogCWVjaG8gIk9LIgogICAgIGVsc2UKIAllY2hvICJGQUlMRUQiCiAgICAgZW5kaWYKIAorICAgICIgRXhpc3Rpbmcgd2luZG93IHZhcmlhYmxlCisgICAgZWNobyAndzp3aW5kb3dfdmFyOiAxJworICAgIGxldCB3OndpbmRvd192YXIgPSAxCisgICAgaWYgZXhpc3RzKCd3OndpbmRvd192YXInKQorCWVjaG8gIk9LIgorICAgIGVsc2UKKwllY2hvICJGQUlMRUQiCisgICAgZW5kaWYKKworICAgICIgTm9uLWV4aXN0aW5nIHdpbmRvdyB2YXJpYWJsZQorICAgIHVubGV0IHc6d2luZG93X3ZhcgorICAgIGVjaG8gJ3c6d2luZG93X3ZhcjogMCcKKyAgICBpZiAhZXhpc3RzKCd3OndpbmRvd192YXInKQorCWVjaG8gIk9LIgorICAgIGVsc2UKKwllY2hvICJGQUlMRUQiCisgICAgZW5kaWYKKworICAgICIgRXhpc3Rpbmcgd2luZG93IGxpc3QKKyAgICBsZXQgdzp3aW5kb3dfbGlzdCA9IFsiYmx1ZSIsICJvcmFuZ2UiXQorICAgIGVjaG8gJ3c6d2luZG93X2xpc3Q6IDEnCisgICAgaWYgZXhpc3RzKCd3OndpbmRvd19saXN0JykKKwllY2hvICJPSyIKKyAgICBlbHNlCisJZWNobyAiRkFJTEVEIgorICAgIGVuZGlmCisKKyAgICAiIE5vbi1leGlzdGluZyB3aW5kb3cgbGlzdAorICAgIHVubGV0IHc6d2luZG93X2xpc3QKKyAgICBlY2hvICd3OndpbmRvd19saXN0OiAwJworICAgIGlmICFleGlzdHMoJ3c6d2luZG93X2xpc3QnKQorCWVjaG8gIk9LIgorICAgIGVsc2UKKwllY2hvICJGQUlMRUQiCisgICAgZW5kaWYKKworICAgICIgRXhpc3Rpbmcgd2luZG93IGRpY3Rpb25hcnkKKyAgICBsZXQgdzp3aW5kb3dfZGljdCA9IHsieGNvcmQiOjEwMCwgInljb3JkIjoyfQorICAgIGVjaG8gJ3c6d2luZG93X2RpY3Q6IDEnCisgICAgaWYgZXhpc3RzKCd3OndpbmRvd19kaWN0JykKKwllY2hvICJPSyIKKyAgICBlbHNlCisJZWNobyAiRkFJTEVEIgorICAgIGVuZGlmCisKKyAgICAiIE5vbi1leGlzdGluZyB3aW5kb3cgZGljdGlvbmFyeQorICAgIHVubGV0IHc6d2luZG93X2RpY3QKKyAgICBlY2hvICd3OndpbmRvd19kaWN0OiAwJworICAgIGlmICFleGlzdHMoJ3c6d2luZG93X2RpY3QnKQorCWVjaG8gIk9LIgorICAgIGVsc2UKKwllY2hvICJGQUlMRUQiCisgICAgZW5kaWYKKworICAgICIgRXhpc3Rpbmcgd2luZG93IGN1cmx5LWJyYWNlIHZhcmlhYmxlCisgICAgbGV0IHN0ciA9ICJ3aW5kb3ciCisgICAgbGV0IHc6Y3VybHlfe3N0cn1fdmFyID0gMQorICAgIGVjaG8gJ3c6Y3VybHlfJyAuIHN0ciAuICdfdmFyOiAxJworICAgIGlmIGV4aXN0cygndzpjdXJseV97c3RyfV92YXInKQorCWVjaG8gIk9LIgorICAgIGVsc2UKKwllY2hvICJGQUlMRUQiCisgICAgZW5kaWYKKworICAgICIgTm9uLWV4aXN0aW5nIHdpbmRvdyBjdXJseS1icmFjZSB2YXJpYWJsZQorICAgIHVubGV0IHc6Y3VybHlfe3N0cn1fdmFyCisgICAgZWNobyAndzpjdXJseV8nIC4gc3RyIC4gJ192YXI6IDAnCisgICAgaWYgIWV4aXN0cygndzpjdXJseV97c3RyfV92YXInKQorCWVjaG8gIk9LIgorICAgIGVsc2UKKwllY2hvICJGQUlMRUQiCisgICAgZW5kaWYKKworICAgICIgRXhpc3RpbmcgYnVmZmVyIHZhcmlhYmxlCisgICAgZWNobyAnYjpidWZmZXJfdmFyOiAxJworICAgIGxldCBiOmJ1ZmZlcl92YXIgPSAxCisgICAgaWYgZXhpc3RzKCdiOmJ1ZmZlcl92YXInKQorCWVjaG8gIk9LIgorICAgIGVsc2UKKwllY2hvICJGQUlMRUQiCisgICAgZW5kaWYKKworICAgICIgTm9uLWV4aXN0aW5nIGJ1ZmZlciB2YXJpYWJsZQorICAgIHVubGV0IGI6YnVmZmVyX3ZhcgorICAgIGVjaG8gJ2I6YnVmZmVyX3ZhcjogMCcKKyAgICBpZiAhZXhpc3RzKCdiOmJ1ZmZlcl92YXInKQorCWVjaG8gIk9LIgorICAgIGVsc2UKKwllY2hvICJGQUlMRUQiCisgICAgZW5kaWYKKworICAgICIgRXhpc3RpbmcgYnVmZmVyIGxpc3QKKyAgICBsZXQgYjpidWZmZXJfbGlzdCA9IFsiYmx1ZSIsICJvcmFuZ2UiXQorICAgIGVjaG8gJ2I6YnVmZmVyX2xpc3Q6IDEnCisgICAgaWYgZXhpc3RzKCdiOmJ1ZmZlcl9saXN0JykKKwllY2hvICJPSyIKKyAgICBlbHNlCisJZWNobyAiRkFJTEVEIgorICAgIGVuZGlmCisKKyAgICAiIE5vbi1leGlzdGluZyBidWZmZXIgbGlzdAorICAgIHVubGV0IGI6YnVmZmVyX2xpc3QKKyAgICBlY2hvICdiOmJ1ZmZlcl9saXN0OiAwJworICAgIGlmICFleGlzdHMoJ2I6YnVmZmVyX2xpc3QnKQorCWVjaG8gIk9LIgorICAgIGVsc2UKKwllY2hvICJGQUlMRUQiCisgICAgZW5kaWYKKworICAgICIgRXhpc3RpbmcgYnVmZmVyIGRpY3Rpb25hcnkKKyAgICBsZXQgYjpidWZmZXJfZGljdCA9IHsieGNvcmQiOjEwMCwgInljb3JkIjoyfQorICAgIGVjaG8gJ2I6YnVmZmVyX2RpY3Q6IDEnCisgICAgaWYgZXhpc3RzKCdiOmJ1ZmZlcl9kaWN0JykKKwllY2hvICJPSyIKKyAgICBlbHNlCisJZWNobyAiRkFJTEVEIgorICAgIGVuZGlmCisKKyAgICAiIE5vbi1leGlzdGluZyBidWZmZXIgZGljdGlvbmFyeQorICAgIHVubGV0IGI6YnVmZmVyX2RpY3QKKyAgICBlY2hvICdiOmJ1ZmZlcl9kaWN0OiAwJworICAgIGlmICFleGlzdHMoJ2I6YnVmZmVyX2RpY3QnKQorCWVjaG8gIk9LIgorICAgIGVsc2UKKwllY2hvICJGQUlMRUQiCisgICAgZW5kaWYKKworICAgICIgRXhpc3RpbmcgYnVmZmVyIGN1cmx5LWJyYWNlIHZhcmlhYmxlCisgICAgbGV0IHN0ciA9ICJidWZmZXIiCisgICAgbGV0IGI6Y3VybHlfe3N0cn1fdmFyID0gMQorICAgIGVjaG8gJ2I6Y3VybHlfJyAuIHN0ciAuICdfdmFyOiAxJworICAgIGlmIGV4aXN0cygnYjpjdXJseV97c3RyfV92YXInKQorCWVjaG8gIk9LIgorICAgIGVsc2UKKwllY2hvICJGQUlMRUQiCisgICAgZW5kaWYKKworICAgICIgTm9uLWV4aXN0aW5nIGJ1ZmZlciBjdXJseS1icmFjZSB2YXJpYWJsZQorICAgIHVubGV0IGI6Y3VybHlfe3N0cn1fdmFyCisgICAgZWNobyAnYjpjdXJseV8nIC4gc3RyIC4gJ192YXI6IDAnCisgICAgaWYgIWV4aXN0cygnYjpjdXJseV97c3RyfV92YXInKQorCWVjaG8gIk9LIgorICAgIGVsc2UKKwllY2hvICJGQUlMRUQiCisgICAgZW5kaWYKKwogICAgICIgU2NyaXB0LWxvY2FsIHRlc3RzCiAgICAgc291cmNlIHRlc3Q2MC52aW0KIAorICAgICIgRXhpc3RpbmcgVmltIGludGVybmFsIHZhcmlhYmxlCisgICAgZWNobyAndjp2ZXJzaW9uOiAxJworICAgIGlmIGV4aXN0cygndjp2ZXJzaW9uJykKKwllY2hvICJPSyIKKyAgICBlbHNlCisJZWNobyAiRkFJTEVEIgorICAgIGVuZGlmCisKKyAgICAiIE5vbi1leGlzdGluZyBWaW0gaW50ZXJuYWwgdmFyaWFibGUKKyAgICBlY2hvICd2Om5vbl9leGlzdHNfdmFyOiAwJworICAgIGlmICFleGlzdHMoJ3Y6bm9uX2V4aXN0c192YXInKQorCWVjaG8gIk9LIgorICAgIGVsc2UKKwllY2hvICJGQUlMRUQiCisgICAgZW5kaWYKKworICAgICIgRnVuY3Rpb24gYXJndW1lbnRzCisgICAgZnVuY3Rpb24gVGVzdEZ1bmNBcmcoZnVuY19hcmcsIC4uLikKKyAgICAgICAgZWNobyAnYTpmdW5jX2FyZzogMScKKyAgICAgICAgaWYgZXhpc3RzKCdhOmZ1bmNfYXJnJykKKyAgICAgICAgICAgIGVjaG8gIk9LIgorICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJGQUlMRUQiCisgICAgICAgIGVuZGlmCisKKyAgICAgICAgZWNobyAnYTpub25fZXhpc3RzX2FyZzogMCcKKyAgICAgICAgaWYgIWV4aXN0cygnYTpub25fZXhpc3RzX2FyZycpCisgICAgICAgICAgICBlY2hvICJPSyIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiRkFJTEVEIgorICAgICAgICBlbmRpZgorCisgICAgICAgIGVjaG8gJ2E6MTogMScKKyAgICAgICAgaWYgZXhpc3RzKCdhOjEnKQorICAgICAgICAgICAgZWNobyAiT0siCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIkZBSUxFRCIKKyAgICAgICAgZW5kaWYKKworICAgICAgICBlY2hvICdhOjI6IDAnCisgICAgICAgIGlmICFleGlzdHMoJ2E6MicpCisgICAgICAgICAgICBlY2hvICJPSyIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiRkFJTEVEIgorICAgICAgICBlbmRpZgorICAgIGVuZGZ1bmN0aW9uCisKKyAgICBjYWxsIFRlc3RGdW5jQXJnKCJhcmcxIiwgImFyZzIiKQorCiAgICAgcmVkaXIgRU5ECiBlbmRmdW5jdGlvbgogOmNhbGwgVGVzdEV4aXN0cygpCmRpZmYgLS1naXQgYS9zcmMvdGVzdGRpci90ZXN0NjAub2sgYi9zcmMvdGVzdGRpci90ZXN0NjAub2sKaW5kZXggZmU2YzRiNy4uNDZhNzJlNCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RkaXIvdGVzdDYwLm9rCisrKyBiL3NyYy90ZXN0ZGlyL3Rlc3Q2MC5vawpAQCAtMzMsNiArMzMsMTAgQEAKIE9LCiAmdHc6IDEKIE9LCismZzplcnJvcmZvcm1hdDogMQorT0sKKyZsOmVycm9yZm9ybWF0OiAxCitPSwogJm5vam9pbnNwYWNlczogMAogT0sKICZub2pzOiAwCkBAIC04NSwyNyArODksODcgQEAKIE9LCiBsb2NhbF9kaWN0OiAwCiBPSworY3VybHlfbG9jYWxfdmFyOiAxCitPSworY3VybHlfbG9jYWxfdmFyOiAwCitPSwogZzpnbG9iYWxfdmFyOiAxCiBPSwogZzpnbG9iYWxfdmFyOiAwCiBPSwotY3VybHlfe3N0cn1fdmFyOiAxCitnOmdsb2JhbF9saXN0OiAxCiBPSwotY3VybHlfe3N0cn1fdmFyOiAwCitnOmdsb2JhbF9saXN0OiAwCiBPSwotZzpjdXJseV97c3RyfV92YXI6IDEKK2c6Z2xvYmFsX2RpY3Q6IDEKIE9LCi1nOmN1cmx5X3tzdHJ9X3ZhcjogMAorZzpnbG9iYWxfZGljdDogMAorT0sKK2c6Y3VybHlfZ2xvYmFsX3ZhcjogMQorT0sKK2c6Y3VybHlfZ2xvYmFsX3ZhcjogMAorT0sKK3c6d2luZG93X3ZhcjogMQorT0sKK3c6d2luZG93X3ZhcjogMAorT0sKK3c6d2luZG93X2xpc3Q6IDEKK09LCit3OndpbmRvd19saXN0OiAwCitPSwordzp3aW5kb3dfZGljdDogMQorT0sKK3c6d2luZG93X2RpY3Q6IDAKK09LCit3OmN1cmx5X3dpbmRvd192YXI6IDEKK09LCit3OmN1cmx5X3dpbmRvd192YXI6IDAKK09LCitiOmJ1ZmZlcl92YXI6IDEKK09LCitiOmJ1ZmZlcl92YXI6IDAKK09LCitiOmJ1ZmZlcl9saXN0OiAxCitPSworYjpidWZmZXJfbGlzdDogMAorT0sKK2I6YnVmZmVyX2RpY3Q6IDEKK09LCitiOmJ1ZmZlcl9kaWN0OiAwCitPSworYjpjdXJseV9idWZmZXJfdmFyOiAxCitPSworYjpjdXJseV9idWZmZXJfdmFyOiAwCiBPSwogczpzY3JpcHRfdmFyOiAxCiBPSwogczpzY3JpcHRfdmFyOiAwCiBPSwotczpjdXJseV97c3RyfV92YXI6IDEKK3M6c2NyaXB0X2xpc3Q6IDEKIE9LCi1zOmN1cmx5X3tzdHJ9X3ZhcjogMAorczpzY3JpcHRfbGlzdDogMAorT0sKK3M6c2NyaXB0X2RpY3Q6IDEKK09LCitzOnNjcmlwdF9kaWN0OiAwCitPSworczpjdXJseV9zY3JpcHRfdmFyOiAxCitPSworczpjdXJseV9zY3JpcHRfdmFyOiAwCiBPSwogKnM6bXlfc2NyaXB0X2Z1bmM6IDEKIE9LCiAqczpteV9zY3JpcHRfZnVuYzogMAogT0sKK3Y6dmVyc2lvbjogMQorT0sKK3Y6bm9uX2V4aXN0c192YXI6IDAKK09LCithOmZ1bmNfYXJnOiAxCitPSworYTpub25fZXhpc3RzX2FyZzogMAorT0sKK2E6MTogMQorT0sKK2E6MjogMAorT0sKZGlmZiAtLWdpdCBhL3NyYy90ZXN0ZGlyL3Rlc3Q2MC52aW0gYi9zcmMvdGVzdGRpci90ZXN0NjAudmltCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZWVhNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdGRpci90ZXN0NjAudmltCkBAIC0wLDAgKzEsOTcgQEAKKyIgVmltIHNjcmlwdCBmb3IgZXhpc3RzKCkgZnVuY3Rpb24gdGVzdAorIiBTY3JpcHQtbG9jYWwgdmFyaWFibGVzIGFyZSBjaGVja2VkIGhlcmUKKworIiBFeGlzdGluZyBzY3JpcHQtbG9jYWwgdmFyaWFibGUKK2xldCBzOnNjcmlwdF92YXIgPSAxCitlY2hvICdzOnNjcmlwdF92YXI6IDEnCitpZiBleGlzdHMoJ3M6c2NyaXB0X3ZhcicpCisgICAgZWNobyAiT0siCitlbHNlCisgICAgZWNobyAiRkFJTEVEIgorZW5kaWYKKworIiBOb24tZXhpc3Rpbmcgc2NyaXB0LWxvY2FsIHZhcmlhYmxlCit1bmxldCBzOnNjcmlwdF92YXIKK2VjaG8gJ3M6c2NyaXB0X3ZhcjogMCcKK2lmICFleGlzdHMoJ3M6c2NyaXB0X3ZhcicpCisgICAgZWNobyAiT0siCitlbHNlCisgICAgZWNobyAiRkFJTEVEIgorZW5kaWYKKworIiBFeGlzdGluZyBzY3JpcHQtbG9jYWwgbGlzdAorbGV0IHM6c2NyaXB0X2xpc3QgPSBbImJsdWUiLCAib3JhbmdlIl0KK2VjaG8gJ3M6c2NyaXB0X2xpc3Q6IDEnCitpZiBleGlzdHMoJ3M6c2NyaXB0X2xpc3QnKQorICAgIGVjaG8gIk9LIgorZWxzZQorICAgIGVjaG8gIkZBSUxFRCIKK2VuZGlmCisKKyIgTm9uLWV4aXN0aW5nIHNjcmlwdC1sb2NhbCBsaXN0Cit1bmxldCBzOnNjcmlwdF9saXN0CitlY2hvICdzOnNjcmlwdF9saXN0OiAwJworaWYgIWV4aXN0cygnczpzY3JpcHRfbGlzdCcpCisgICAgZWNobyAiT0siCitlbHNlCisgICAgZWNobyAiRkFJTEVEIgorZW5kaWYKKworIiBFeGlzdGluZyBzY3JpcHQtbG9jYWwgZGljdGlvbmFyeQorbGV0IHM6c2NyaXB0X2RpY3QgPSB7Inhjb3JkIjoxMDAsICJ5Y29yZCI6Mn0KK2VjaG8gJ3M6c2NyaXB0X2RpY3Q6IDEnCitpZiBleGlzdHMoJ3M6c2NyaXB0X2RpY3QnKQorICAgIGVjaG8gIk9LIgorZWxzZQorICAgIGVjaG8gIkZBSUxFRCIKK2VuZGlmCisKKyIgTm9uLWV4aXN0aW5nIHNjcmlwdC1sb2NhbCBkaWN0aW9uYXJ5Cit1bmxldCBzOnNjcmlwdF9kaWN0CitlY2hvICdzOnNjcmlwdF9kaWN0OiAwJworaWYgIWV4aXN0cygnczpzY3JpcHRfZGljdCcpCisgICAgZWNobyAiT0siCitlbHNlCisgICAgZWNobyAiRkFJTEVEIgorZW5kaWYKKworIiBFeGlzdGluZyBzY3JpcHQgY3VybHktYnJhY2UgdmFyaWFibGUKK2xldCBzdHIgPSAic2NyaXB0IgorbGV0IHM6Y3VybHlfe3N0cn1fdmFyID0gMQorZWNobyAnczpjdXJseV8nIC4gc3RyIC4gJ192YXI6IDEnCitpZiBleGlzdHMoJ3M6Y3VybHlfe3N0cn1fdmFyJykKKyAgICBlY2hvICJPSyIKK2Vsc2UKKyAgICBlY2hvICJGQUlMRUQiCitlbmRpZgorCisiIE5vbi1leGlzdGluZyBzY3JpcHQtbG9jYWwgY3VybHktYnJhY2UgdmFyaWFibGUKK3VubGV0IHM6Y3VybHlfe3N0cn1fdmFyCitlY2hvICdzOmN1cmx5XycgLiBzdHIgLiAnX3ZhcjogMCcKK2lmICFleGlzdHMoJ3M6Y3VybHlfe3N0cn1fdmFyJykKKyAgICBlY2hvICJPSyIKK2Vsc2UKKyAgICBlY2hvICJGQUlMRUQiCitlbmRpZgorCisiIEV4aXN0aW5nIHNjcmlwdC1sb2NhbCBmdW5jdGlvbgorZnVuY3Rpb24hIHM6bXlfc2NyaXB0X2Z1bmMoKQorZW5kZnVuY3Rpb24KKworZWNobyAnKnM6bXlfc2NyaXB0X2Z1bmM6IDEnCitpZiBleGlzdHMoJypzOm15X3NjcmlwdF9mdW5jJykKKyAgICBlY2hvICJPSyIKK2Vsc2UKKyAgICBlY2hvICJGQUlMRUQiCitlbmRpZgorCisiIE5vbi1leGlzdGluZyBzY3JpcHQtbG9jYWwgZnVuY3Rpb24KK2RlbGZ1bmN0aW9uIHM6bXlfc2NyaXB0X2Z1bmMKKworZWNobyAnKnM6bXlfc2NyaXB0X2Z1bmM6IDAnCitpZiAhZXhpc3RzKCcqczpteV9zY3JpcHRfZnVuYycpCisgICAgZWNobyAiT0siCitlbHNlCisgICAgZWNobyAiRkFJTEVEIgorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvc3JjL3ZlcnNpb24uaCBiL3NyYy92ZXJzaW9uLmgKaW5kZXggMjUzMTAyYi4uNDQ3ZjRmYSAxMDA2NDQKLS0tIGEvc3JjL3ZlcnNpb24uaAorKysgYi9zcmMvdmVyc2lvbi5oCkBAIC0zNiw1ICszNiw1IEBACiAjZGVmaW5lIFZJTV9WRVJTSU9OX05PRE9UCSJ2aW03MGFhIgogI2RlZmluZSBWSU1fVkVSU0lPTl9TSE9SVAkiNy4wYWEiCiAjZGVmaW5lIFZJTV9WRVJTSU9OX01FRElVTQkiNy4wYWEgQUxQSEEiCi0jZGVmaW5lIFZJTV9WRVJTSU9OX0xPTkcJIlZJTSAtIFZpIElNcHJvdmVkIDcuMGFhIEFMUEhBICgyMDA1IERlYyAyOSkiCi0jZGVmaW5lIFZJTV9WRVJTSU9OX0xPTkdfREFURQkiVklNIC0gVmkgSU1wcm92ZWQgNy4wYWEgQUxQSEEgKDIwMDUgRGVjIDI5LCBjb21waWxlZCAiCisjZGVmaW5lIFZJTV9WRVJTSU9OX0xPTkcJIlZJTSAtIFZpIElNcHJvdmVkIDcuMGFhIEFMUEhBICgyMDA2IEphbiAxMikiCisjZGVmaW5lIFZJTV9WRVJTSU9OX0xPTkdfREFURQkiVklNIC0gVmkgSU1wcm92ZWQgNy4wYWEgQUxQSEEgKDIwMDYgSmFuIDEyLCBjb21waWxlZCAiCg==