LyoKICogaW50ZWxmYgogKgogKiBMaW51eCBmcmFtZWJ1ZmZlciBkcml2ZXIgZm9yIEludGVsKFIpIDg2NUcgaW50ZWdyYXRlZCBncmFwaGljcyBjaGlwcy4KICoKICogQ29weXJpZ2h0IKkgMjAwMiwgMjAwMyBEYXZpZCBEYXdlcyA8ZGF3ZXNAeGZyZWU4Ni5vcmc+CiAqICAgICAgICAgICAgICAgICAgIDIwMDQgU3lsdmFpbiBNZXllcgogKgogKiBUaGlzIGRyaXZlciBjb25zaXN0cyBvZiB0d28gcGFydHMuICBUaGUgZmlyc3QgcGFydCAoaW50ZWxmYmRydi5jKSBwcm92aWRlcwogKiB0aGUgYmFzaWMgZmJkZXYgaW50ZXJmYWNlcywgaXMgZGVyaXZlZCBpbiBwYXJ0IGZyb20gdGhlIHJhZGVvbmZiIGFuZAogKiB2ZXNhZmIgZHJpdmVycywgYW5kIGlzIGNvdmVyZWQgYnkgdGhlIEdQTC4gIFRoZSBzZWNvbmQgcGFydCAoaW50ZWxmYmh3LmMpCiAqIHByb3ZpZGVzIHRoZSBjb2RlIHRvIHByb2dyYW0gdGhlIGhhcmR3YXJlLiAgTW9zdCBvZiBpdCBpcyBkZXJpdmVkIGZyb20KICogdGhlIGk4MTAvaTgzMCBYRnJlZTg2IGRyaXZlci4gIFRoZSBIVy1zcGVjaWZpYyBjb2RlIGlzIGNvdmVyZWQgaGVyZQogKiB1bmRlciBhIGR1YWwgbGljZW5zZSAoR1BMIGFuZCBNSVQvWEZyZWU4NiBsaWNlbnNlKS4KICoKICogQXV0aG9yOiBEYXZpZCBEYXdlcwogKgogKi8KCi8qICRESEQ6IGludGVsZmIvaW50ZWxmYmh3LmMsdiAxLjkgMjAwMy8wNi8yNyAxNTowNjoyNSBkYXdlcyBFeHAgJCAqLwoKI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L21tLmg+CiNpbmNsdWRlIDxsaW51eC90dHkuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiNpbmNsdWRlIDxsaW51eC9mYi5oPgojaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgojaW5jbHVkZSA8bGludXgvc2VsZWN0aW9uLmg+CiNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgojaW5jbHVkZSA8bGludXgva2QuaD4KI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4KI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KCiNpbmNsdWRlIDxhc20vaW8uaD4KCiNpbmNsdWRlICJpbnRlbGZiLmgiCiNpbmNsdWRlICJpbnRlbGZiaHcuaCIKCmludAppbnRlbGZiaHdfZ2V0X2NoaXBzZXQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IGNoYXIgKipuYW1lLCBpbnQgKmNoaXBzZXQsCgkJICAgICAgaW50ICptb2JpbGUpCnsKCXUzMiB0bXA7CgoJaWYgKCFwZGV2IHx8ICFuYW1lIHx8ICFjaGlwc2V0IHx8ICFtb2JpbGUpCgkJcmV0dXJuIDE7CgoJc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsKCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MzBNOgoJCSpuYW1lID0gIkludGVsKFIpIDgzME0iOwoJCSpjaGlwc2V0ID0gSU5URUxfODMwTTsKCQkqbW9iaWxlID0gMTsKCQlyZXR1cm4gMDsKCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84NDVHOgoJCSpuYW1lID0gIkludGVsKFIpIDg0NUciOwoJCSpjaGlwc2V0ID0gSU5URUxfODQ1RzsKCQkqbW9iaWxlID0gMDsKCQlyZXR1cm4gMDsKCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84NVhHTToKCQl0bXAgPSAwOwoJCSptb2JpbGUgPSAxOwoJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBJTlRFTF84NVhfQ0FQSUQsICZ0bXApOwoJCXN3aXRjaCAoKHRtcCA+PiBJTlRFTF84NVhfVkFSSUFOVF9TSElGVCkgJgoJCQlJTlRFTF84NVhfVkFSSUFOVF9NQVNLKSB7CgkJY2FzZSBJTlRFTF9WQVJfODU1R01FOgoJCQkqbmFtZSA9ICJJbnRlbChSKSA4NTVHTUUiOwoJCQkqY2hpcHNldCA9IElOVEVMXzg1NUdNRTsKCQkJcmV0dXJuIDA7CgkJY2FzZSBJTlRFTF9WQVJfODU1R006CgkJCSpuYW1lID0gIkludGVsKFIpIDg1NUdNIjsKCQkJKmNoaXBzZXQgPSBJTlRFTF84NTVHTTsKCQkJcmV0dXJuIDA7CgkJY2FzZSBJTlRFTF9WQVJfODUyR01FOgoJCQkqbmFtZSA9ICJJbnRlbChSKSA4NTJHTUUiOwoJCQkqY2hpcHNldCA9IElOVEVMXzg1MkdNRTsKCQkJcmV0dXJuIDA7CgkJY2FzZSBJTlRFTF9WQVJfODUyR006CgkJCSpuYW1lID0gIkludGVsKFIpIDg1MkdNIjsKCQkJKmNoaXBzZXQgPSBJTlRFTF84NTJHTTsKCQkJcmV0dXJuIDA7CgkJZGVmYXVsdDoKCQkJKm5hbWUgPSAiSW50ZWwoUikgODUyR00vODU1R00iOwoJCQkqY2hpcHNldCA9IElOVEVMXzg1WEdNOwoJCQlyZXR1cm4gMDsKCQl9CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODY1RzoKCQkqbmFtZSA9ICJJbnRlbChSKSA4NjVHIjsKCQkqY2hpcHNldCA9IElOVEVMXzg2NUc7CgkJKm1vYmlsZSA9IDA7CgkJcmV0dXJuIDA7CgljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfOTE1RzoKCQkqbmFtZSA9ICJJbnRlbChSKSA5MTVHIjsKCQkqY2hpcHNldCA9IElOVEVMXzkxNUc7CgkJKm1vYmlsZSA9IDA7CgkJcmV0dXJuIDA7CglkZWZhdWx0OgoJCXJldHVybiAxOwoJfQp9CgppbnQKaW50ZWxmYmh3X2dldF9tZW1vcnkoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCAqYXBlcnR1cmVfc2l6ZSwKCQkgICAgIGludCAqc3RvbGVuX3NpemUpCnsKCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2VfZGV2OwoJdTE2IHRtcDsKCglpZiAoIXBkZXYgfHwgIWFwZXJ0dXJlX3NpemUgfHwgIXN0b2xlbl9zaXplKQoJCXJldHVybiAxOwoKCS8qIEZpbmQgdGhlIGJyaWRnZSBkZXZpY2UuICBJdCBpcyBhbHdheXMgMDowLjAgKi8KCWlmICghKGJyaWRnZV9kZXYgPSBwY2lfZmluZF9zbG90KDAsIFBDSV9ERVZGTigwLCAwKSkpKSB7CgkJRVJSX01TRygiY2Fubm90IGZpbmQgYnJpZGdlIGRldmljZVxuIik7CgkJcmV0dXJuIDE7Cgl9CgoJLyogR2V0IHRoZSBmYiBhcGVydHVyZSBzaXplIGFuZCAic3RvbGVuIiBtZW1vcnkgYW1vdW50LiAqLwoJdG1wID0gMDsKCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJyaWRnZV9kZXYsIElOVEVMX0dNQ0hfQ1RSTCwgJnRtcCk7Cglzd2l0Y2ggKHBkZXYtPmRldmljZSkgewoJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgzME06CgljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfODQ1RzoKCQlpZiAoKHRtcCAmIElOVEVMX0dNQ0hfTUVNX01BU0spID09IElOVEVMX0dNQ0hfTUVNXzY0TSkKCQkJKmFwZXJ0dXJlX3NpemUgPSBNQig2NCk7CgkJZWxzZQoJCQkqYXBlcnR1cmVfc2l6ZSA9IE1CKDEyOCk7CgkJc3dpdGNoICh0bXAgJiBJTlRFTF84MzBfR01DSF9HTVNfTUFTSykgewoJCWNhc2UgSU5URUxfODMwX0dNQ0hfR01TX1NUT0xFTl81MTI6CgkJCSpzdG9sZW5fc2l6ZSA9IEtCKDUxMikgLSBLQigxMzIpOwoJCQlyZXR1cm4gMDsKCQljYXNlIElOVEVMXzgzMF9HTUNIX0dNU19TVE9MRU5fMTAyNDoKCQkJKnN0b2xlbl9zaXplID0gTUIoMSkgLSBLQigxMzIpOwoJCQlyZXR1cm4gMDsKCQljYXNlIElOVEVMXzgzMF9HTUNIX0dNU19TVE9MRU5fODE5MjoKCQkJKnN0b2xlbl9zaXplID0gTUIoOCkgLSBLQigxMzIpOwoJCQlyZXR1cm4gMDsKCQljYXNlIElOVEVMXzgzMF9HTUNIX0dNU19MT0NBTDoKCQkJRVJSX01TRygib25seSBsb2NhbCBtZW1vcnkgZm91bmRcbiIpOwoJCQlyZXR1cm4gMTsKCQljYXNlIElOVEVMXzgzMF9HTUNIX0dNU19ESVNBQkxFRDoKCQkJRVJSX01TRygidmlkZW8gbWVtb3J5IGlzIGRpc2FibGVkXG4iKTsKCQkJcmV0dXJuIDE7CgkJZGVmYXVsdDoKCQkJRVJSX01TRygidW5leHBlY3RlZCBHTUNIX0dNUyB2YWx1ZTogMHglMDJ4XG4iLAoJCQkJdG1wICYgSU5URUxfODMwX0dNQ0hfR01TX01BU0spOwoJCQlyZXR1cm4gMTsKCQl9CgkJYnJlYWs7CglkZWZhdWx0OgoJCSphcGVydHVyZV9zaXplID0gTUIoMTI4KTsKCQlzd2l0Y2ggKHRtcCAmIElOVEVMXzg1NV9HTUNIX0dNU19NQVNLKSB7CgkJY2FzZSBJTlRFTF84NTVfR01DSF9HTVNfU1RPTEVOXzFNOgoJCQkqc3RvbGVuX3NpemUgPSBNQigxKSAtIEtCKDEzMik7CgkJCXJldHVybiAwOwoJCWNhc2UgSU5URUxfODU1X0dNQ0hfR01TX1NUT0xFTl80TToKCQkJKnN0b2xlbl9zaXplID0gTUIoNCkgLSBLQigxMzIpOwoJCQlyZXR1cm4gMDsKCQljYXNlIElOVEVMXzg1NV9HTUNIX0dNU19TVE9MRU5fOE06CgkJCSpzdG9sZW5fc2l6ZSA9IE1CKDgpIC0gS0IoMTMyKTsKCQkJcmV0dXJuIDA7CgkJY2FzZSBJTlRFTF84NTVfR01DSF9HTVNfU1RPTEVOXzE2TToKCQkJKnN0b2xlbl9zaXplID0gTUIoMTYpIC0gS0IoMTMyKTsKCQkJcmV0dXJuIDA7CgkJY2FzZSBJTlRFTF84NTVfR01DSF9HTVNfU1RPTEVOXzMyTToKCQkJKnN0b2xlbl9zaXplID0gTUIoMzIpIC0gS0IoMTMyKTsKCQkJcmV0dXJuIDA7CgkJY2FzZSBJTlRFTF85MTVHX0dNQ0hfR01TX1NUT0xFTl80OE06CgkJCSpzdG9sZW5fc2l6ZSA9IE1CKDQ4KSAtIEtCKDEzMik7CgkJCXJldHVybiAwOwoJCWNhc2UgSU5URUxfOTE1R19HTUNIX0dNU19TVE9MRU5fNjRNOgoJCQkqc3RvbGVuX3NpemUgPSBNQig2NCkgLSBLQigxMzIpOwoJCQlyZXR1cm4gMDsKCQljYXNlIElOVEVMXzg1NV9HTUNIX0dNU19ESVNBQkxFRDoKCQkJRVJSX01TRygidmlkZW8gbWVtb3J5IGlzIGRpc2FibGVkXG4iKTsKCQkJcmV0dXJuIDA7CgkJZGVmYXVsdDoKCQkJRVJSX01TRygidW5leHBlY3RlZCBHTUNIX0dNUyB2YWx1ZTogMHglMDJ4XG4iLAoJCQkJdG1wICYgSU5URUxfODU1X0dNQ0hfR01TX01BU0spOwoJCQlyZXR1cm4gMTsKCQl9Cgl9Cn0KCmludAppbnRlbGZiaHdfY2hlY2tfbm9uX2NydChzdHJ1Y3QgaW50ZWxmYl9pbmZvICpkaW5mbykKewoJaW50IGR2byA9IDA7CgoJaWYgKElOUkVHKExWRFMpICYgUE9SVF9FTkFCTEUpCgkJZHZvIHw9IExWRFNfUE9SVDsKCWlmIChJTlJFRyhEVk9BKSAmIFBPUlRfRU5BQkxFKQoJCWR2byB8PSBEVk9BX1BPUlQ7CglpZiAoSU5SRUcoRFZPQikgJiBQT1JUX0VOQUJMRSkKCQlkdm8gfD0gRFZPQl9QT1JUOwoJaWYgKElOUkVHKERWT0MpICYgUE9SVF9FTkFCTEUpCgkJZHZvIHw9IERWT0NfUE9SVDsKCglyZXR1cm4gZHZvOwp9Cgpjb25zdCBjaGFyICoKaW50ZWxmYmh3X2R2b190b19zdHJpbmcoaW50IGR2bykKewoJaWYgKGR2byAmIERWT0FfUE9SVCkKCQlyZXR1cm4gIkRWTyBwb3J0IEEiOwoJZWxzZSBpZiAoZHZvICYgRFZPQl9QT1JUKQoJCXJldHVybiAiRFZPIHBvcnQgQiI7CgllbHNlIGlmIChkdm8gJiBEVk9DX1BPUlQpCgkJcmV0dXJuICJEVk8gcG9ydCBDIjsKCWVsc2UgaWYgKGR2byAmIExWRFNfUE9SVCkKCQlyZXR1cm4gIkxWRFMgcG9ydCI7CgllbHNlCgkJcmV0dXJuIE5VTEw7Cn0KCgppbnQKaW50ZWxmYmh3X3ZhbGlkYXRlX21vZGUoc3RydWN0IGludGVsZmJfaW5mbyAqZGluZm8sCgkJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQp7CglpbnQgYnl0ZXNfcGVyX3BpeGVsOwoJaW50IHRtcDsKCiNpZiBWRVJCT1NFID4gMAoJREJHX01TRygiaW50ZWxmYmh3X3ZhbGlkYXRlX21vZGVcbiIpOwojZW5kaWYKCglieXRlc19wZXJfcGl4ZWwgPSB2YXItPmJpdHNfcGVyX3BpeGVsIC8gODsKCWlmIChieXRlc19wZXJfcGl4ZWwgPT0gMykKCQlieXRlc19wZXJfcGl4ZWwgPSA0OwoKCS8qIENoZWNrIGlmIGVub3VnaCB2aWRlbyBtZW1vcnkuICovCgl0bXAgPSB2YXItPnlyZXNfdmlydHVhbCAqIHZhci0+eHJlc192aXJ0dWFsICogYnl0ZXNfcGVyX3BpeGVsOwoJaWYgKHRtcCA+IGRpbmZvLT5mYi5zaXplKSB7CgkJV1JOX01TRygiTm90IGVub3VnaCB2aWRlbyByYW0gZm9yIG1vZGUgIgoJCQkiKCVkIEtCeXRlIHZzICVkIEtCeXRlKS5cbiIsCgkJCUJ0b0tCKHRtcCksIEJ0b0tCKGRpbmZvLT5mYi5zaXplKSk7CgkJcmV0dXJuIDE7Cgl9CgoJLyogQ2hlY2sgaWYgeC95IGxpbWl0cyBhcmUgT0suICovCglpZiAodmFyLT54cmVzIC0gMSA+IEhBQ1RJVkVfTUFTSykgewoJCVdSTl9NU0coIlggcmVzb2x1dGlvbiB0b28gbGFyZ2UgKCVkIHZzICVkKS5cbiIsCgkJCXZhci0+eHJlcywgSEFDVElWRV9NQVNLICsgMSk7CgkJcmV0dXJuIDE7Cgl9CglpZiAodmFyLT55cmVzIC0gMSA+IFZBQ1RJVkVfTUFTSykgewoJCVdSTl9NU0coIlkgcmVzb2x1dGlvbiB0b28gbGFyZ2UgKCVkIHZzICVkKS5cbiIsCgkJCXZhci0+eXJlcywgVkFDVElWRV9NQVNLICsgMSk7CgkJcmV0dXJuIDE7Cgl9CgoJLyogQ2hlY2sgZm9yIGludGVybGFjZWQvZG91Ymxlc2NhbiBtb2Rlcy4gKi8KCWlmICh2YXItPnZtb2RlICYgRkJfVk1PREVfSU5URVJMQUNFRCkgewoJCVdSTl9NU0coIk1vZGUgaXMgaW50ZXJsYWNlZC5cbiIpOwoJCXJldHVybiAxOwoJfQoJaWYgKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9ET1VCTEUpIHsKCQlXUk5fTVNHKCJNb2RlIGlzIGRvdWJsZS1zY2FuLlxuIik7CgkJcmV0dXJuIDE7Cgl9CgoJLyogQ2hlY2sgaWYgY2xvY2sgaXMgT0suICovCgl0bXAgPSAxMDAwMDAwMDAwIC8gdmFyLT5waXhjbG9jazsKCWlmICh0bXAgPCBNSU5fQ0xPQ0spIHsKCQlXUk5fTVNHKCJQaXhlbCBjbG9jayBpcyB0b28gbG93ICglZCBNSHogdnMgJWQgTUh6KS5cbiIsCgkJCSh0bXAgKyA1MDApIC8gMTAwMCwgTUlOX0NMT0NLIC8gMTAwMCk7CgkJcmV0dXJuIDE7Cgl9CglpZiAodG1wID4gTUFYX0NMT0NLKSB7CgkJV1JOX01TRygiUGl4ZWwgY2xvY2sgaXMgdG9vIGhpZ2ggKCVkIE1IeiB2cyAlZCBNSHopLlxuIiwKCQkJKHRtcCArIDUwMCkgLyAxMDAwLCBNQVhfQ0xPQ0sgLyAxMDAwKTsKCQlyZXR1cm4gMTsKCX0KCglyZXR1cm4gMDsKfQoKaW50CmludGVsZmJod19wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCXN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvID0gR0VUX0RJTkZPKGluZm8pOwoJdTMyIG9mZnNldCwgeG9mZnNldCwgeW9mZnNldDsKCiNpZiBWRVJCT1NFID4gMAoJREJHX01TRygiaW50ZWxmYmh3X3Bhbl9kaXNwbGF5XG4iKTsKI2VuZGlmCgoJeG9mZnNldCA9IFJPVU5EX0RPV05fVE8odmFyLT54b2Zmc2V0LCA4KTsKCXlvZmZzZXQgPSB2YXItPnlvZmZzZXQ7CgoJaWYgKCh4b2Zmc2V0ICsgdmFyLT54cmVzID4gdmFyLT54cmVzX3ZpcnR1YWwpIHx8CgkgICAgKHlvZmZzZXQgKyB2YXItPnlyZXMgPiB2YXItPnlyZXNfdmlydHVhbCkpCgkJcmV0dXJuIC1FSU5WQUw7CgoJb2Zmc2V0ID0gKHlvZmZzZXQgKiBkaW5mby0+cGl0Y2gpICsKCQkgKHhvZmZzZXQgKiB2YXItPmJpdHNfcGVyX3BpeGVsKSAvIDg7CgoJb2Zmc2V0ICs9IGRpbmZvLT5mYi5vZmZzZXQgPDwgMTI7CgoJT1VUUkVHKERTUEFCQVNFLCBvZmZzZXQpOwoKCXJldHVybiAwOwp9CgovKiBCbGFuayB0aGUgc2NyZWVuLiAqLwp2b2lkCmludGVsZmJod19kb19ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglzdHJ1Y3QgaW50ZWxmYl9pbmZvICpkaW5mbyA9IEdFVF9ESU5GTyhpbmZvKTsKCXUzMiB0bXA7CgojaWYgVkVSQk9TRSA+IDAKCURCR19NU0coImludGVsZmJod19kb19ibGFuazogYmxhbmsgaXMgJWRcbiIsIGJsYW5rKTsKI2VuZGlmCgoJLyogVHVybiBwbGFuZSBBIG9uIG9yIG9mZiAqLwoJdG1wID0gSU5SRUcoRFNQQUNOVFIpOwoJaWYgKGJsYW5rKQoJCXRtcCAmPSB+RElTUFBMQU5FX1BMQU5FX0VOQUJMRTsKCWVsc2UKCQl0bXAgfD0gRElTUFBMQU5FX1BMQU5FX0VOQUJMRTsKCU9VVFJFRyhEU1BBQ05UUiwgdG1wKTsKCS8qIEZsdXNoICovCgl0bXAgPSBJTlJFRyhEU1BBQkFTRSk7CglPVVRSRUcoRFNQQUJBU0UsIHRtcCk7CgoJLyogVHVybiBvZmYvb24gdGhlIEhXIGN1cnNvciAqLwojaWYgVkVSQk9TRSA+IDAKCURCR19NU0coImN1cnNvcl9vbiBpcyAlZFxuIiwgZGluZm8tPmN1cnNvcl9vbik7CiNlbmRpZgoJaWYgKGRpbmZvLT5jdXJzb3Jfb24pIHsKCQlpZiAoYmxhbmspIHsKCQkJaW50ZWxmYmh3X2N1cnNvcl9oaWRlKGRpbmZvKTsKCQl9IGVsc2UgewoJCQlpbnRlbGZiaHdfY3Vyc29yX3Nob3coZGluZm8pOwoJCX0KCQlkaW5mby0+Y3Vyc29yX29uID0gMTsKCX0KCWRpbmZvLT5jdXJzb3JfYmxhbmtlZCA9IGJsYW5rOwoKCS8qIFNldCBEUE1TIGxldmVsICovCgl0bXAgPSBJTlJFRyhBRFBBKSAmIH5BRFBBX0RQTVNfQ09OVFJPTF9NQVNLOwoJc3dpdGNoIChibGFuaykgewoJY2FzZSBGQl9CTEFOS19VTkJMQU5LOgoJY2FzZSBGQl9CTEFOS19OT1JNQUw6CgkJdG1wIHw9IEFEUEFfRFBNU19EMDsKCQlicmVhazsKCWNhc2UgRkJfQkxBTktfVlNZTkNfU1VTUEVORDoKCQl0bXAgfD0gQURQQV9EUE1TX0QxOwoJCWJyZWFrOwoJY2FzZSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EOgoJCXRtcCB8PSBBRFBBX0RQTVNfRDI7CgkJYnJlYWs7CgljYXNlIEZCX0JMQU5LX1BPV0VSRE9XTjoKCQl0bXAgfD0gQURQQV9EUE1TX0QzOwoJCWJyZWFrOwoJfQoJT1VUUkVHKEFEUEEsIHRtcCk7CgoJcmV0dXJuOwp9CgoKdm9pZAppbnRlbGZiaHdfc2V0Y29scmVnKHN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvLCB1bnNpZ25lZCByZWdubywKCQkgICAgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwgdW5zaWduZWQgYmx1ZSwKCQkgICAgdW5zaWduZWQgdHJhbnNwKQp7CiNpZiBWRVJCT1NFID4gMAoJREJHX01TRygiaW50ZWxmYmh3X3NldGNvbHJlZzogJWQ6ICglZCwgJWQsICVkKVxuIiwKCQlyZWdubywgcmVkLCBncmVlbiwgYmx1ZSk7CiNlbmRpZgoKCXUzMiBwYWxldHRlX3JlZyA9IChkaW5mby0+cGlwZSA9PSBQSVBFX0EpID8KCQkJICBQQUxFVFRFX0EgOiBQQUxFVFRFX0I7CgoJT1VUUkVHKHBhbGV0dGVfcmVnICsgKHJlZ25vIDw8IDIpLAoJICAgICAgIChyZWQgPDwgUEFMRVRURV84X1JFRF9TSElGVCkgfAoJICAgICAgIChncmVlbiA8PCBQQUxFVFRFXzhfR1JFRU5fU0hJRlQpIHwKCSAgICAgICAoYmx1ZSA8PCBQQUxFVFRFXzhfQkxVRV9TSElGVCkpOwp9CgoKaW50CmludGVsZmJod19yZWFkX2h3X3N0YXRlKHN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvLCBzdHJ1Y3QgaW50ZWxmYl9od3N0YXRlICpodywKCQkJaW50IGZsYWcpCnsKCWludCBpOwoKI2lmIFZFUkJPU0UgPiAwCglEQkdfTVNHKCJpbnRlbGZiaHdfcmVhZF9od19zdGF0ZVxuIik7CiNlbmRpZgoKCWlmICghaHcgfHwgIWRpbmZvKQoJCXJldHVybiAtMTsKCgkvKiBSZWFkIGluIGFzIG11Y2ggb2YgdGhlIEhXIHN0YXRlIGFzIHBvc3NpYmxlLiAqLwoJaHctPnZnYTBfZGl2aXNvciA9IElOUkVHKFZHQTBfRElWSVNPUik7Cglody0+dmdhMV9kaXZpc29yID0gSU5SRUcoVkdBMV9ESVZJU09SKTsKCWh3LT52Z2FfcGQgPSBJTlJFRyhWR0FQRCk7Cglody0+ZHBsbF9hID0gSU5SRUcoRFBMTF9BKTsKCWh3LT5kcGxsX2IgPSBJTlJFRyhEUExMX0IpOwoJaHctPmZwYTAgPSBJTlJFRyhGUEEwKTsKCWh3LT5mcGExID0gSU5SRUcoRlBBMSk7Cglody0+ZnBiMCA9IElOUkVHKEZQQjApOwoJaHctPmZwYjEgPSBJTlJFRyhGUEIxKTsKCglpZiAoZmxhZyA9PSAxKQoJCXJldHVybiBmbGFnOwoKI2lmIDAKCS8qIFRoaXMgc2VlbXMgdG8gYmUgYSBwcm9ibGVtIHdpdGggdGhlIDg1MkdNLzg1NUdNICovCglmb3IgKGkgPSAwOyBpIDwgUEFMRVRURV84X0VOVFJJRVM7IGkrKykgewoJCWh3LT5wYWxldHRlX2FbaV0gPSBJTlJFRyhQQUxFVFRFX0EgKyAoaSA8PCAyKSk7CgkJaHctPnBhbGV0dGVfYltpXSA9IElOUkVHKFBBTEVUVEVfQiArIChpIDw8IDIpKTsKCX0KI2VuZGlmCgoJaWYgKGZsYWcgPT0gMikKCQlyZXR1cm4gZmxhZzsKCglody0+aHRvdGFsX2EgPSBJTlJFRyhIVE9UQUxfQSk7Cglody0+aGJsYW5rX2EgPSBJTlJFRyhIQkxBTktfQSk7Cglody0+aHN5bmNfYSA9IElOUkVHKEhTWU5DX0EpOwoJaHctPnZ0b3RhbF9hID0gSU5SRUcoVlRPVEFMX0EpOwoJaHctPnZibGFua19hID0gSU5SRUcoVkJMQU5LX0EpOwoJaHctPnZzeW5jX2EgPSBJTlJFRyhWU1lOQ19BKTsKCWh3LT5zcmNfc2l6ZV9hID0gSU5SRUcoU1JDX1NJWkVfQSk7Cglody0+YmNscnBhdF9hID0gSU5SRUcoQkNMUlBBVF9BKTsKCWh3LT5odG90YWxfYiA9IElOUkVHKEhUT1RBTF9CKTsKCWh3LT5oYmxhbmtfYiA9IElOUkVHKEhCTEFOS19CKTsKCWh3LT5oc3luY19iID0gSU5SRUcoSFNZTkNfQik7Cglody0+dnRvdGFsX2IgPSBJTlJFRyhWVE9UQUxfQik7Cglody0+dmJsYW5rX2IgPSBJTlJFRyhWQkxBTktfQik7Cglody0+dnN5bmNfYiA9IElOUkVHKFZTWU5DX0IpOwoJaHctPnNyY19zaXplX2IgPSBJTlJFRyhTUkNfU0laRV9CKTsKCWh3LT5iY2xycGF0X2IgPSBJTlJFRyhCQ0xSUEFUX0IpOwoKCWlmIChmbGFnID09IDMpCgkJcmV0dXJuIGZsYWc7CgoJaHctPmFkcGEgPSBJTlJFRyhBRFBBKTsKCWh3LT5kdm9hID0gSU5SRUcoRFZPQSk7Cglody0+ZHZvYiA9IElOUkVHKERWT0IpOwoJaHctPmR2b2MgPSBJTlJFRyhEVk9DKTsKCWh3LT5kdm9hX3NyY2RpbSA9IElOUkVHKERWT0FfU1JDRElNKTsKCWh3LT5kdm9iX3NyY2RpbSA9IElOUkVHKERWT0JfU1JDRElNKTsKCWh3LT5kdm9jX3NyY2RpbSA9IElOUkVHKERWT0NfU1JDRElNKTsKCWh3LT5sdmRzID0gSU5SRUcoTFZEUyk7CgoJaWYgKGZsYWcgPT0gNCkKCQlyZXR1cm4gZmxhZzsKCglody0+cGlwZV9hX2NvbmYgPSBJTlJFRyhQSVBFQUNPTkYpOwoJaHctPnBpcGVfYl9jb25mID0gSU5SRUcoUElQRUJDT05GKTsKCWh3LT5kaXNwX2FyYiA9IElOUkVHKERJU1BBUkIpOwoKCWlmIChmbGFnID09IDUpCgkJcmV0dXJuIGZsYWc7CgoJaHctPmN1cnNvcl9hX2NvbnRyb2wgPSBJTlJFRyhDVVJTT1JfQV9DT05UUk9MKTsKCWh3LT5jdXJzb3JfYl9jb250cm9sID0gSU5SRUcoQ1VSU09SX0JfQ09OVFJPTCk7Cglody0+Y3Vyc29yX2FfYmFzZSA9IElOUkVHKENVUlNPUl9BX0JBU0VBRERSKTsKCWh3LT5jdXJzb3JfYl9iYXNlID0gSU5SRUcoQ1VSU09SX0JfQkFTRUFERFIpOwoKCWlmIChmbGFnID09IDYpCgkJcmV0dXJuIGZsYWc7CgoJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewoJCWh3LT5jdXJzb3JfYV9wYWxldHRlW2ldID0gSU5SRUcoQ1VSU09SX0FfUEFMRVRURTAgKyAoaSA8PCAyKSk7CgkJaHctPmN1cnNvcl9iX3BhbGV0dGVbaV0gPSBJTlJFRyhDVVJTT1JfQl9QQUxFVFRFMCArIChpIDw8IDIpKTsKCX0KCglpZiAoZmxhZyA9PSA3KQoJCXJldHVybiBmbGFnOwoKCWh3LT5jdXJzb3Jfc2l6ZSA9IElOUkVHKENVUlNPUl9TSVpFKTsKCglpZiAoZmxhZyA9PSA4KQoJCXJldHVybiBmbGFnOwoKCWh3LT5kaXNwX2FfY3RybCA9IElOUkVHKERTUEFDTlRSKTsKCWh3LT5kaXNwX2JfY3RybCA9IElOUkVHKERTUEJDTlRSKTsKCWh3LT5kaXNwX2FfYmFzZSA9IElOUkVHKERTUEFCQVNFKTsKCWh3LT5kaXNwX2JfYmFzZSA9IElOUkVHKERTUEJCQVNFKTsKCWh3LT5kaXNwX2Ffc3RyaWRlID0gSU5SRUcoRFNQQVNUUklERSk7Cglody0+ZGlzcF9iX3N0cmlkZSA9IElOUkVHKERTUEJTVFJJREUpOwoKCWlmIChmbGFnID09IDkpCgkJcmV0dXJuIGZsYWc7CgoJaHctPnZnYWNudHJsID0gSU5SRUcoVkdBQ05UUkwpOwoKCWlmIChmbGFnID09IDEwKQoJCXJldHVybiBmbGFnOwoKCWh3LT5hZGRfaWQgPSBJTlJFRyhBRERfSUQpOwoKCWlmIChmbGFnID09IDExKQoJCXJldHVybiBmbGFnOwoKCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKCQlody0+c3dmMHhbaV0gPSBJTlJFRyhTV0YwMCArIChpIDw8IDIpKTsKCQlody0+c3dmMXhbaV0gPSBJTlJFRyhTV0YxMCArIChpIDw8IDIpKTsKCQlpZiAoaSA8IDMpCgkJCWh3LT5zd2YzeFtpXSA9IElOUkVHKFNXRjMwICsgKGkgPDwgMikpOwoJfQoKCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCgkJaHctPmZlbmNlW2ldID0gSU5SRUcoRkVOQ0UgKyAoaSA8PCAyKSk7CgoJaHctPmluc3RwbSA9IElOUkVHKElOU1RQTSk7Cglody0+bWVtX21vZGUgPSBJTlJFRyhNRU1fTU9ERSk7Cglody0+ZndfYmxjXzAgPSBJTlJFRyhGV19CTENfMCk7Cglody0+ZndfYmxjXzEgPSBJTlJFRyhGV19CTENfMSk7CgoJcmV0dXJuIDA7Cn0KCgp2b2lkCmludGVsZmJod19wcmludF9od19zdGF0ZShzdHJ1Y3QgaW50ZWxmYl9pbmZvICpkaW5mbywgc3RydWN0IGludGVsZmJfaHdzdGF0ZSAqaHcpCnsKI2lmIFJFR0RVTVAKCWludCBpLCBtMSwgbTIsIG4sIHAxLCBwMjsKCglEQkdfTVNHKCJpbnRlbGZiaHdfcHJpbnRfaHdfc3RhdGVcbiIpOwoKCWlmICghaHcgfHwgIWRpbmZvKQoJCXJldHVybjsKCS8qIFJlYWQgaW4gYXMgbXVjaCBvZiB0aGUgSFcgc3RhdGUgYXMgcG9zc2libGUuICovCglwcmludGsoImh3IHN0YXRlIGR1bXAgc3RhcnRcbiIpOwoJcHJpbnRrKCIJVkdBMF9ESVZJU09SOgkJMHglMDh4XG4iLCBody0+dmdhMF9kaXZpc29yKTsKCXByaW50aygiCVZHQTFfRElWSVNPUjoJCTB4JTA4eFxuIiwgaHctPnZnYTFfZGl2aXNvcik7CglwcmludGsoIglWR0FQRDogCQkJMHglMDh4XG4iLCBody0+dmdhX3BkKTsKCW4gPSAoaHctPnZnYTBfZGl2aXNvciA+PiBGUF9OX0RJVklTT1JfU0hJRlQpICYgRlBfRElWSVNPUl9NQVNLOwoJbTEgPSAoaHctPnZnYTBfZGl2aXNvciA+PiBGUF9NMV9ESVZJU09SX1NISUZUKSAmIEZQX0RJVklTT1JfTUFTSzsKCW0yID0gKGh3LT52Z2EwX2Rpdmlzb3IgPj4gRlBfTTJfRElWSVNPUl9TSElGVCkgJiBGUF9ESVZJU09SX01BU0s7CglpZiAoaHctPnZnYV9wZCAmIFZHQVBEXzBfUDFfRk9SQ0VfRElWMikKCQlwMSA9IDA7CgllbHNlCgkJcDEgPSAoaHctPnZnYV9wZCA+PiBWR0FQRF8wX1AxX1NISUZUKSAmIERQTExfUDFfTUFTSzsKCXAyID0gKGh3LT52Z2FfcGQgPj4gVkdBUERfMF9QMl9TSElGVCkgJiBEUExMX1AyX01BU0s7CglwcmludGsoIglWR0EwOiAobTEsIG0yLCBuLCBwMSwgcDIpID0gKCVkLCAlZCwgJWQsICVkLCAlZClcbiIsCgkJbTEsIG0yLCBuLCBwMSwgcDIpOwoJcHJpbnRrKCIJVkdBMDogY2xvY2sgaXMgJWRcbiIsIENBTENfVkNMT0NLKG0xLCBtMiwgbiwgcDEsIHAyKSk7CgoJbiA9IChody0+dmdhMV9kaXZpc29yID4+IEZQX05fRElWSVNPUl9TSElGVCkgJiBGUF9ESVZJU09SX01BU0s7CgltMSA9IChody0+dmdhMV9kaXZpc29yID4+IEZQX00xX0RJVklTT1JfU0hJRlQpICYgRlBfRElWSVNPUl9NQVNLOwoJbTIgPSAoaHctPnZnYTFfZGl2aXNvciA+PiBGUF9NMl9ESVZJU09SX1NISUZUKSAmIEZQX0RJVklTT1JfTUFTSzsKCWlmIChody0+dmdhX3BkICYgVkdBUERfMV9QMV9GT1JDRV9ESVYyKQoJCXAxID0gMDsKCWVsc2UKCQlwMSA9IChody0+dmdhX3BkID4+IFZHQVBEXzFfUDFfU0hJRlQpICYgRFBMTF9QMV9NQVNLOwoJcDIgPSAoaHctPnZnYV9wZCA+PiBWR0FQRF8xX1AyX1NISUZUKSAmIERQTExfUDJfTUFTSzsKCXByaW50aygiCVZHQTE6IChtMSwgbTIsIG4sIHAxLCBwMikgPSAoJWQsICVkLCAlZCwgJWQsICVkKVxuIiwKCQltMSwgbTIsIG4sIHAxLCBwMik7CglwcmludGsoIglWR0ExOiBjbG9jayBpcyAlZFxuIiwgQ0FMQ19WQ0xPQ0sobTEsIG0yLCBuLCBwMSwgcDIpKTsKCglwcmludGsoIglEUExMX0E6CQkJMHglMDh4XG4iLCBody0+ZHBsbF9hKTsKCXByaW50aygiCURQTExfQjoJCQkweCUwOHhcbiIsIGh3LT5kcGxsX2IpOwoJcHJpbnRrKCIJRlBBMDoJCQkweCUwOHhcbiIsIGh3LT5mcGEwKTsKCXByaW50aygiCUZQQTE6CQkJMHglMDh4XG4iLCBody0+ZnBhMSk7CglwcmludGsoIglGUEIwOgkJCTB4JTA4eFxuIiwgaHctPmZwYjApOwoJcHJpbnRrKCIJRlBCMToJCQkweCUwOHhcbiIsIGh3LT5mcGIxKTsKCgluID0gKGh3LT5mcGEwID4+IEZQX05fRElWSVNPUl9TSElGVCkgJiBGUF9ESVZJU09SX01BU0s7CgltMSA9IChody0+ZnBhMCA+PiBGUF9NMV9ESVZJU09SX1NISUZUKSAmIEZQX0RJVklTT1JfTUFTSzsKCW0yID0gKGh3LT5mcGEwID4+IEZQX00yX0RJVklTT1JfU0hJRlQpICYgRlBfRElWSVNPUl9NQVNLOwoJaWYgKGh3LT5kcGxsX2EgJiBEUExMX1AxX0ZPUkNFX0RJVjIpCgkJcDEgPSAwOwoJZWxzZQoJCXAxID0gKGh3LT5kcGxsX2EgPj4gRFBMTF9QMV9TSElGVCkgJiBEUExMX1AxX01BU0s7CglwMiA9IChody0+ZHBsbF9hID4+IERQTExfUDJfU0hJRlQpICYgRFBMTF9QMl9NQVNLOwoJcHJpbnRrKCIJUExMQTA6IChtMSwgbTIsIG4sIHAxLCBwMikgPSAoJWQsICVkLCAlZCwgJWQsICVkKVxuIiwKCQltMSwgbTIsIG4sIHAxLCBwMik7CglwcmludGsoIglQTExBMDogY2xvY2sgaXMgJWRcbiIsIENBTENfVkNMT0NLKG0xLCBtMiwgbiwgcDEsIHAyKSk7CgoJbiA9IChody0+ZnBhMSA+PiBGUF9OX0RJVklTT1JfU0hJRlQpICYgRlBfRElWSVNPUl9NQVNLOwoJbTEgPSAoaHctPmZwYTEgPj4gRlBfTTFfRElWSVNPUl9TSElGVCkgJiBGUF9ESVZJU09SX01BU0s7CgltMiA9IChody0+ZnBhMSA+PiBGUF9NMl9ESVZJU09SX1NISUZUKSAmIEZQX0RJVklTT1JfTUFTSzsKCWlmIChody0+ZHBsbF9hICYgRFBMTF9QMV9GT1JDRV9ESVYyKQoJCXAxID0gMDsKCWVsc2UKCQlwMSA9IChody0+ZHBsbF9hID4+IERQTExfUDFfU0hJRlQpICYgRFBMTF9QMV9NQVNLOwoJcDIgPSAoaHctPmRwbGxfYSA+PiBEUExMX1AyX1NISUZUKSAmIERQTExfUDJfTUFTSzsKCXByaW50aygiCVBMTEExOiAobTEsIG0yLCBuLCBwMSwgcDIpID0gKCVkLCAlZCwgJWQsICVkLCAlZClcbiIsCgkJbTEsIG0yLCBuLCBwMSwgcDIpOwoJcHJpbnRrKCIJUExMQTE6IGNsb2NrIGlzICVkXG4iLCBDQUxDX1ZDTE9DSyhtMSwgbTIsIG4sIHAxLCBwMikpOwoKI2lmIDAKCXByaW50aygiCVBBTEVUVEVfQTpcbiIpOwoJZm9yIChpID0gMDsgaSA8IFBBTEVUVEVfOF9FTlRSSUVTKQoJCXByaW50aygiCSUzZDoJMHglMDh4XG4iLCBpLCBody0+cGFsZXR0ZV9hW2ldOwoJcHJpbnRrKCIJUEFMRVRURV9COlxuIik7Cglmb3IgKGkgPSAwOyBpIDwgUEFMRVRURV84X0VOVFJJRVMpCgkJcHJpbnRrKCIJJTNkOgkweCUwOHhcbiIsIGksIGh3LT5wYWxldHRlX2JbaV07CiNlbmRpZgoKCXByaW50aygiCUhUT1RBTF9BOgkJMHglMDh4XG4iLCBody0+aHRvdGFsX2EpOwoJcHJpbnRrKCIJSEJMQU5LX0E6CQkweCUwOHhcbiIsIGh3LT5oYmxhbmtfYSk7CglwcmludGsoIglIU1lOQ19BOgkJMHglMDh4XG4iLCBody0+aHN5bmNfYSk7CglwcmludGsoIglWVE9UQUxfQToJCTB4JTA4eFxuIiwgaHctPnZ0b3RhbF9hKTsKCXByaW50aygiCVZCTEFOS19BOgkJMHglMDh4XG4iLCBody0+dmJsYW5rX2EpOwoJcHJpbnRrKCIJVlNZTkNfQToJCTB4JTA4eFxuIiwgaHctPnZzeW5jX2EpOwoJcHJpbnRrKCIJU1JDX1NJWkVfQToJCTB4JTA4eFxuIiwgaHctPnNyY19zaXplX2EpOwoJcHJpbnRrKCIJQkNMUlBBVF9BOgkJMHglMDh4XG4iLCBody0+YmNscnBhdF9hKTsKCXByaW50aygiCUhUT1RBTF9COgkJMHglMDh4XG4iLCBody0+aHRvdGFsX2IpOwoJcHJpbnRrKCIJSEJMQU5LX0I6CQkweCUwOHhcbiIsIGh3LT5oYmxhbmtfYik7CglwcmludGsoIglIU1lOQ19COgkJMHglMDh4XG4iLCBody0+aHN5bmNfYik7CglwcmludGsoIglWVE9UQUxfQjoJCTB4JTA4eFxuIiwgaHctPnZ0b3RhbF9iKTsKCXByaW50aygiCVZCTEFOS19COgkJMHglMDh4XG4iLCBody0+dmJsYW5rX2IpOwoJcHJpbnRrKCIJVlNZTkNfQjoJCTB4JTA4eFxuIiwgaHctPnZzeW5jX2IpOwoJcHJpbnRrKCIJU1JDX1NJWkVfQjoJCTB4JTA4eFxuIiwgaHctPnNyY19zaXplX2IpOwoJcHJpbnRrKCIJQkNMUlBBVF9COgkJMHglMDh4XG4iLCBody0+YmNscnBhdF9iKTsKCglwcmludGsoIglBRFBBOgkJCTB4JTA4eFxuIiwgaHctPmFkcGEpOwoJcHJpbnRrKCIJRFZPQToJCQkweCUwOHhcbiIsIGh3LT5kdm9hKTsKCXByaW50aygiCURWT0I6CQkJMHglMDh4XG4iLCBody0+ZHZvYik7CglwcmludGsoIglEVk9DOgkJCTB4JTA4eFxuIiwgaHctPmR2b2MpOwoJcHJpbnRrKCIJRFZPQV9TUkNESU06CQkweCUwOHhcbiIsIGh3LT5kdm9hX3NyY2RpbSk7CglwcmludGsoIglEVk9CX1NSQ0RJTToJCTB4JTA4eFxuIiwgaHctPmR2b2Jfc3JjZGltKTsKCXByaW50aygiCURWT0NfU1JDRElNOgkJMHglMDh4XG4iLCBody0+ZHZvY19zcmNkaW0pOwoJcHJpbnRrKCIJTFZEUzoJCQkweCUwOHhcbiIsIGh3LT5sdmRzKTsKCglwcmludGsoIglQSVBFQUNPTkY6CQkweCUwOHhcbiIsIGh3LT5waXBlX2FfY29uZik7CglwcmludGsoIglQSVBFQkNPTkY6CQkweCUwOHhcbiIsIGh3LT5waXBlX2JfY29uZik7CglwcmludGsoIglESVNQQVJCOgkJMHglMDh4XG4iLCBody0+ZGlzcF9hcmIpOwoKCXByaW50aygiCUNVUlNPUl9BX0NPTlRST0w6CTB4JTA4eFxuIiwgaHctPmN1cnNvcl9hX2NvbnRyb2wpOwoJcHJpbnRrKCIJQ1VSU09SX0JfQ09OVFJPTDoJMHglMDh4XG4iLCBody0+Y3Vyc29yX2JfY29udHJvbCk7CglwcmludGsoIglDVVJTT1JfQV9CQVNFQUREUjoJMHglMDh4XG4iLCBody0+Y3Vyc29yX2FfYmFzZSk7CglwcmludGsoIglDVVJTT1JfQl9CQVNFQUREUjoJMHglMDh4XG4iLCBody0+Y3Vyc29yX2JfYmFzZSk7CgoJcHJpbnRrKCIJQ1VSU09SX0FfUEFMRVRURToJIik7Cglmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CgkJcHJpbnRrKCIweCUwOHgiLCBody0+Y3Vyc29yX2FfcGFsZXR0ZVtpXSk7CgkJaWYgKGkgPCAzKQoJCQlwcmludGsoIiwgIik7Cgl9CglwcmludGsoIlxuIik7CglwcmludGsoIglDVVJTT1JfQl9QQUxFVFRFOgkiKTsKCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKCQlwcmludGsoIjB4JTA4eCIsIGh3LT5jdXJzb3JfYl9wYWxldHRlW2ldKTsKCQlpZiAoaSA8IDMpCgkJCXByaW50aygiLCAiKTsKCX0KCXByaW50aygiXG4iKTsKCglwcmludGsoIglDVVJTT1JfU0laRToJCTB4JTA4eFxuIiwgaHctPmN1cnNvcl9zaXplKTsKCglwcmludGsoIglEU1BBQ05UUjoJCTB4JTA4eFxuIiwgaHctPmRpc3BfYV9jdHJsKTsKCXByaW50aygiCURTUEJDTlRSOgkJMHglMDh4XG4iLCBody0+ZGlzcF9iX2N0cmwpOwoJcHJpbnRrKCIJRFNQQUJBU0U6CQkweCUwOHhcbiIsIGh3LT5kaXNwX2FfYmFzZSk7CglwcmludGsoIglEU1BCQkFTRToJCTB4JTA4eFxuIiwgaHctPmRpc3BfYl9iYXNlKTsKCXByaW50aygiCURTUEFTVFJJREU6CQkweCUwOHhcbiIsIGh3LT5kaXNwX2Ffc3RyaWRlKTsKCXByaW50aygiCURTUEJTVFJJREU6CQkweCUwOHhcbiIsIGh3LT5kaXNwX2Jfc3RyaWRlKTsKCglwcmludGsoIglWR0FDTlRSTDoJCTB4JTA4eFxuIiwgaHctPnZnYWNudHJsKTsKCXByaW50aygiCUFERF9JRDoJCQkweCUwOHhcbiIsIGh3LT5hZGRfaWQpOwoKCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKCQlwcmludGsoIglTV0YwJWQJCQkweCUwOHhcbiIsIGksCgkJCWh3LT5zd2YweFtpXSk7Cgl9Cglmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CgkJcHJpbnRrKCIJU1dGMSVkCQkJMHglMDh4XG4iLCBpLAoJCQlody0+c3dmMXhbaV0pOwoJfQoJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewoJCXByaW50aygiCVNXRjMlZAkJCTB4JTA4eFxuIiwgaSwKCQkJaHctPnN3ZjN4W2ldKTsKCX0KCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCgkJcHJpbnRrKCIJRkVOQ0UlZAkJCTB4JTA4eFxuIiwgaSwKCQkJaHctPmZlbmNlW2ldKTsKCglwcmludGsoIglJTlNUUE0JCQkweCUwOHhcbiIsIGh3LT5pbnN0cG0pOwoJcHJpbnRrKCIJTUVNX01PREUJCTB4JTA4eFxuIiwgaHctPm1lbV9tb2RlKTsKCXByaW50aygiCUZXX0JMQ18wCQkweCUwOHhcbiIsIGh3LT5md19ibGNfMCk7CglwcmludGsoIglGV19CTENfMQkJMHglMDh4XG4iLCBody0+ZndfYmxjXzEpOwoKCXByaW50aygiaHcgc3RhdGUgZHVtcCBlbmRcbiIpOwojZW5kaWYKfQoKLyogU3BsaXQgdGhlIE0gcGFyYW1ldGVyIGludG8gTTEgYW5kIE0yLiAqLwpzdGF0aWMgaW50CnNwbGl0bSh1bnNpZ25lZCBpbnQgbSwgdW5zaWduZWQgaW50ICpyZXRtMSwgdW5zaWduZWQgaW50ICpyZXRtMikKewoJaW50IG0xLCBtMjsKCgltMSA9IChtIC0gMiAtIChNSU5fTTIgKyBNQVhfTTIpIC8gMikgLyA1IC0gMjsKCWlmIChtMSA8IE1JTl9NMSkKCQltMSA9IE1JTl9NMTsKCWlmIChtMSA+IE1BWF9NMSkKCQltMSA9IE1BWF9NMTsKCW0yID0gbSAtIDUgKiAobTEgKyAyKSAtIDI7CglpZiAobTIgPCBNSU5fTTIgfHwgbTIgPiBNQVhfTTIgfHwgbTIgPj0gbTEpIHsKCQlyZXR1cm4gMTsKCX0gZWxzZSB7CgkJKnJldG0xID0gKHVuc2lnbmVkIGludCltMTsKCQkqcmV0bTIgPSAodW5zaWduZWQgaW50KW0yOwoJCXJldHVybiAwOwoJfQp9CgovKiBTcGxpdCB0aGUgUCBwYXJhbWV0ZXIgaW50byBQMSBhbmQgUDIuICovCnN0YXRpYyBpbnQKc3BsaXRwKHVuc2lnbmVkIGludCBwLCB1bnNpZ25lZCBpbnQgKnJldHAxLCB1bnNpZ25lZCBpbnQgKnJldHAyKQp7CglpbnQgcDEsIHAyOwoKCWlmIChwICUgNCA9PSAwKQoJCXAyID0gMTsKCWVsc2UKCQlwMiA9IDA7CglwMSA9IChwIC8gKDEgPDwgKHAyICsgMSkpKSAtIDI7CglpZiAocCAlIDQgPT0gMCAmJiBwMSA8IE1JTl9QMSkgewoJCXAyID0gMDsKCQlwMSA9IChwIC8gKDEgPDwgKHAyICsgMSkpKSAtIDI7Cgl9CglpZiAocDEgIDwgTUlOX1AxIHx8IHAxID4gTUFYX1AxIHx8IChwMSArIDIpICogKDEgPDwgKHAyICsgMSkpICE9IHApIHsKCQlyZXR1cm4gMTsKCX0gZWxzZSB7CgkJKnJldHAxID0gKHVuc2lnbmVkIGludClwMTsKCQkqcmV0cDIgPSAodW5zaWduZWQgaW50KXAyOwoJCXJldHVybiAwOwoJfQp9CgpzdGF0aWMgaW50CmNhbGNfcGxsX3BhcmFtcyhpbnQgY2xvY2ssIHUzMiAqcmV0bTEsIHUzMiAqcmV0bTIsIHUzMiAqcmV0biwgdTMyICpyZXRwMSwKCQl1MzIgKnJldHAyLCB1MzIgKnJldGNsb2NrKQp7Cgl1MzIgbTEsIG0yLCBuLCBwMSwgcDIsIG4xOwoJdTMyIGZfdmNvLCBwLCBwX2Jlc3QgPSAwLCBtLCBmX291dDsKCXUzMiBlcnJfbWF4LCBlcnJfdGFyZ2V0LCBlcnJfYmVzdCA9IDEwMDAwMDAwOwoJdTMyIG5fYmVzdCA9IDAsIG1fYmVzdCA9IDAsIGZfYmVzdCwgZl9lcnI7Cgl1MzIgcF9taW4sIHBfbWF4LCBwX2luYywgZGl2X21pbiwgZGl2X21heDsKCgkvKiBBY2NlcHQgMC41JSBkaWZmZXJlbmNlLCBidXQgYWltIGZvciAwLjElICovCgllcnJfbWF4ID0gNSAqIGNsb2NrIC8gMTAwMDsKCWVycl90YXJnZXQgPSBjbG9jayAvIDEwMDA7CgoJREJHX01TRygiQ2xvY2sgaXMgJWRcbiIsIGNsb2NrKTsKCglkaXZfbWF4ID0gTUFYX1ZDT19GUkVRIC8gY2xvY2s7CglkaXZfbWluID0gUk9VTkRfVVBfVE8oTUlOX1ZDT19GUkVRLCBjbG9jaykgLyBjbG9jazsKCglpZiAoY2xvY2sgPD0gUF9UUkFOU0lUSU9OX0NMT0NLKQoJCXBfaW5jID0gNDsKCWVsc2UKCQlwX2luYyA9IDI7CglwX21pbiA9IFJPVU5EX1VQX1RPKGRpdl9taW4sIHBfaW5jKTsKCXBfbWF4ID0gUk9VTkRfRE9XTl9UTyhkaXZfbWF4LCBwX2luYyk7CglpZiAocF9taW4gPCBNSU5fUCkKCQlwX21pbiA9IDQ7CglpZiAocF9tYXggPiBNQVhfUCkKCQlwX21heCA9IDEyODsKCglEQkdfTVNHKCJwIHJhbmdlIGlzICVkLSVkICglZClcbiIsIHBfbWluLCBwX21heCwgcF9pbmMpOwoKCXAgPSBwX21pbjsKCWRvIHsKCQlpZiAoc3BsaXRwKHAsICZwMSwgJnAyKSkgewoJCQlXUk5fTVNHKCJjYW5ub3Qgc3BsaXQgcCA9ICVkXG4iLCBwKTsKCQkJcCArPSBwX2luYzsKCQkJY29udGludWU7CgkJfQoJCW4gPSBNSU5fTjsKCQlmX3ZjbyA9IGNsb2NrICogcDsKCgkJZG8gewoJCQltID0gUk9VTkRfVVBfVE8oZl92Y28gKiBuLCBQTExfUkVGQ0xLKSAvIFBMTF9SRUZDTEs7CgkJCWlmIChtIDwgTUlOX00pCgkJCQltID0gTUlOX007CgkJCWlmIChtID4gTUFYX00pCgkJCQltID0gTUFYX007CgkJCWZfb3V0ID0gQ0FMQ19WQ0xPQ0szKG0sIG4sIHApOwoJCQlpZiAoc3BsaXRtKG0sICZtMSwgJm0yKSkgewoJCQkJV1JOX01TRygiY2Fubm90IHNwbGl0IG0gPSAlZFxuIiwgbSk7CgkJCQluKys7CgkJCQljb250aW51ZTsKCQkJfQoJCQlpZiAoY2xvY2sgPiBmX291dCkKCQkJCWZfZXJyID0gY2xvY2sgLSBmX291dDsKCQkJZWxzZQoJCQkJZl9lcnIgPSBmX291dCAtIGNsb2NrOwoKCQkJaWYgKGZfZXJyIDwgZXJyX2Jlc3QpIHsKCQkJCW1fYmVzdCA9IG07CgkJCQluX2Jlc3QgPSBuOwoJCQkJcF9iZXN0ID0gcDsKCQkJCWZfYmVzdCA9IGZfb3V0OwoJCQkJZXJyX2Jlc3QgPSBmX2VycjsKCQkJfQoJCQluKys7CgkJfSB3aGlsZSAoKG4gPD0gTUFYX04pICYmIChmX291dCA+PSBjbG9jaykpOwoJCXAgKz0gcF9pbmM7Cgl9IHdoaWxlICgocCA8PSBwX21heCkpOwoKCWlmICghbV9iZXN0KSB7CgkJV1JOX01TRygiY2Fubm90IGZpbmQgcGFyYW1ldGVycyBmb3IgY2xvY2sgJWRcbiIsIGNsb2NrKTsKCQlyZXR1cm4gMTsKCX0KCW0gPSBtX2Jlc3Q7CgluID0gbl9iZXN0OwoJcCA9IHBfYmVzdDsKCXNwbGl0bShtLCAmbTEsICZtMik7CglzcGxpdHAocCwgJnAxLCAmcDIpOwoJbjEgPSBuIC0gMjsKCglEQkdfTVNHKCJtLCBuLCBwOiAlZCAoJWQsJWQpLCAlZCAoJWQpLCAlZCAoJWQsJWQpLCAiCgkJImY6ICVkICglZCksIFZDTzogJWRcbiIsCgkJbSwgbTEsIG0yLCBuLCBuMSwgcCwgcDEsIHAyLAoJCUNBTENfVkNMT0NLMyhtLCBuLCBwKSwgQ0FMQ19WQ0xPQ0sobTEsIG0yLCBuMSwgcDEsIHAyKSwKCQlDQUxDX1ZDTE9DSzMobSwgbiwgcCkgKiBwKTsKCSpyZXRtMSA9IG0xOwoJKnJldG0yID0gbTI7CgkqcmV0biA9IG4xOwoJKnJldHAxID0gcDE7CgkqcmV0cDIgPSBwMjsKCSpyZXRjbG9jayA9IENBTENfVkNMT0NLKG0xLCBtMiwgbjEsIHAxLCBwMik7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBfX2lubGluZV9fIGludApjaGVja19vdmVyZmxvdyh1MzIgdmFsdWUsIHUzMiBsaW1pdCwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24pCnsKCWlmICh2YWx1ZSA+IGxpbWl0KSB7CgkJV1JOX01TRygiJXMgdmFsdWUgJWQgZXhjZWVkcyBsaW1pdCAlZFxuIiwKCQkJZGVzY3JpcHRpb24sIHZhbHVlLCBsaW1pdCk7CgkJcmV0dXJuIDE7Cgl9CglyZXR1cm4gMDsKfQoKLyogSXQgaXMgYXNzdW1lZCB0aGF0IGh3IGlzIGZpbGxlZCBpbiB3aXRoIHRoZSBpbml0aWFsIHN0YXRlIGluZm9ybWF0aW9uLiAqLwppbnQKaW50ZWxmYmh3X21vZGVfdG9faHcoc3RydWN0IGludGVsZmJfaW5mbyAqZGluZm8sIHN0cnVjdCBpbnRlbGZiX2h3c3RhdGUgKmh3LAoJCSAgICAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCnsKCWludCBwaXBlID0gUElQRV9BOwoJdTMyICpkcGxsLCAqZnAwLCAqZnAxOwoJdTMyIG0xLCBtMiwgbiwgcDEsIHAyLCBjbG9ja190YXJnZXQsIGNsb2NrOwoJdTMyIGhzeW5jX3N0YXJ0LCBoc3luY19lbmQsIGhibGFua19zdGFydCwgaGJsYW5rX2VuZCwgaHRvdGFsLCBoYWN0aXZlOwoJdTMyIHZzeW5jX3N0YXJ0LCB2c3luY19lbmQsIHZibGFua19zdGFydCwgdmJsYW5rX2VuZCwgdnRvdGFsLCB2YWN0aXZlOwoJdTMyIHZzeW5jX3BvbCwgaHN5bmNfcG9sOwoJdTMyICp2cywgKnZiLCAqdnQsICpocywgKmhiLCAqaHQsICpzcywgKnBpcGVfY29uZjsKCglEQkdfTVNHKCJpbnRlbGZiaHdfbW9kZV90b19od1xuIik7CgoJLyogRGlzYWJsZSBWR0EgKi8KCWh3LT52Z2FjbnRybCB8PSBWR0FfRElTQUJMRTsKCgkvKiBDaGVjayB3aGV0aGVyIHBpcGUgQSBvciBwaXBlIEIgaXMgZW5hYmxlZC4gKi8KCWlmIChody0+cGlwZV9hX2NvbmYgJiBQSVBFQ09ORl9FTkFCTEUpCgkJcGlwZSA9IFBJUEVfQTsKCWVsc2UgaWYgKGh3LT5waXBlX2JfY29uZiAmIFBJUEVDT05GX0VOQUJMRSkKCQlwaXBlID0gUElQRV9COwoKCS8qIFNldCB3aGljaCBwaXBlJ3MgcmVnaXN0ZXJzIHdpbGwgYmUgc2V0LiAqLwoJaWYgKHBpcGUgPT0gUElQRV9CKSB7CgkJZHBsbCA9ICZody0+ZHBsbF9iOwoJCWZwMCA9ICZody0+ZnBiMDsKCQlmcDEgPSAmaHctPmZwYjE7CgkJaHMgPSAmaHctPmhzeW5jX2I7CgkJaGIgPSAmaHctPmhibGFua19iOwoJCWh0ID0gJmh3LT5odG90YWxfYjsKCQl2cyA9ICZody0+dnN5bmNfYjsKCQl2YiA9ICZody0+dmJsYW5rX2I7CgkJdnQgPSAmaHctPnZ0b3RhbF9iOwoJCXNzID0gJmh3LT5zcmNfc2l6ZV9iOwoJCXBpcGVfY29uZiA9ICZody0+cGlwZV9iX2NvbmY7Cgl9IGVsc2UgewoJCWRwbGwgPSAmaHctPmRwbGxfYTsKCQlmcDAgPSAmaHctPmZwYTA7CgkJZnAxID0gJmh3LT5mcGExOwoJCWhzID0gJmh3LT5oc3luY19hOwoJCWhiID0gJmh3LT5oYmxhbmtfYTsKCQlodCA9ICZody0+aHRvdGFsX2E7CgkJdnMgPSAmaHctPnZzeW5jX2E7CgkJdmIgPSAmaHctPnZibGFua19hOwoJCXZ0ID0gJmh3LT52dG90YWxfYTsKCQlzcyA9ICZody0+c3JjX3NpemVfYTsKCQlwaXBlX2NvbmYgPSAmaHctPnBpcGVfYV9jb25mOwoJfQoKCS8qIFVzZSBBRFBBIHJlZ2lzdGVyIGZvciBzeW5jIGNvbnRyb2wuICovCglody0+YWRwYSAmPSB+QURQQV9VU0VfVkdBX0hWUE9MQVJJVFk7CgoJLyogc3luYyBwb2xhcml0eSAqLwoJaHN5bmNfcG9sID0gKHZhci0+c3luYyAmIEZCX1NZTkNfSE9SX0hJR0hfQUNUKSA/CgkJCUFEUEFfU1lOQ19BQ1RJVkVfSElHSCA6IEFEUEFfU1lOQ19BQ1RJVkVfTE9XOwoJdnN5bmNfcG9sID0gKHZhci0+c3luYyAmIEZCX1NZTkNfVkVSVF9ISUdIX0FDVCkgPwoJCQlBRFBBX1NZTkNfQUNUSVZFX0hJR0ggOiBBRFBBX1NZTkNfQUNUSVZFX0xPVzsKCWh3LT5hZHBhICY9IH4oKEFEUEFfU1lOQ19BQ1RJVkVfTUFTSyA8PCBBRFBBX1ZTWU5DX0FDVElWRV9TSElGVCkgfAoJCSAgICAgIChBRFBBX1NZTkNfQUNUSVZFX01BU0sgPDwgQURQQV9IU1lOQ19BQ1RJVkVfU0hJRlQpKTsKCWh3LT5hZHBhIHw9IChoc3luY19wb2wgPDwgQURQQV9IU1lOQ19BQ1RJVkVfU0hJRlQpIHwKCQkgICAgKHZzeW5jX3BvbCA8PCBBRFBBX1ZTWU5DX0FDVElWRV9TSElGVCk7CgoJLyogQ29ubmVjdCBjb3JyZWN0IHBpcGUgdG8gdGhlIGFuYWxvZyBwb3J0IERBQyAqLwoJaHctPmFkcGEgJj0gfihQSVBFX01BU0sgPDwgQURQQV9QSVBFX1NFTEVDVF9TSElGVCk7Cglody0+YWRwYSB8PSAocGlwZSA8PCBBRFBBX1BJUEVfU0VMRUNUX1NISUZUKTsKCgkvKiBTZXQgRFBNUyBzdGF0ZSB0byBEMCAob24pICovCglody0+YWRwYSAmPSB+QURQQV9EUE1TX0NPTlRST0xfTUFTSzsKCWh3LT5hZHBhIHw9IEFEUEFfRFBNU19EMDsKCglody0+YWRwYSB8PSBBRFBBX0RBQ19FTkFCTEU7CgoJKmRwbGwgfD0gKERQTExfVkNPX0VOQUJMRSB8IERQTExfVkdBX01PREVfRElTQUJMRSk7CgkqZHBsbCAmPSB+KERQTExfUkFURV9TRUxFQ1RfTUFTSyB8IERQTExfUkVGRVJFTkNFX1NFTEVDVF9NQVNLKTsKCSpkcGxsIHw9IChEUExMX1JFRkVSRU5DRV9ERUZBVUxUIHwgRFBMTF9SQVRFX1NFTEVDVF9GUDApOwoKCS8qIERlc2lyZWQgY2xvY2sgaW4ga0h6ICovCgljbG9ja190YXJnZXQgPSAxMDAwMDAwMDAwIC8gdmFyLT5waXhjbG9jazsKCglpZiAoY2FsY19wbGxfcGFyYW1zKGNsb2NrX3RhcmdldCwgJm0xLCAmbTIsICZuLCAmcDEsICZwMiwgJmNsb2NrKSkgewoJCVdSTl9NU0coImNhbGNfcGxsX3BhcmFtcyBmYWlsZWRcbiIpOwoJCXJldHVybiAxOwoJfQoKCS8qIENoZWNrIGZvciBvdmVyZmxvdy4gKi8KCWlmIChjaGVja19vdmVyZmxvdyhwMSwgRFBMTF9QMV9NQVNLLCAiUExMIFAxIHBhcmFtZXRlciIpKQoJCXJldHVybiAxOwoJaWYgKGNoZWNrX292ZXJmbG93KHAyLCBEUExMX1AyX01BU0ssICJQTEwgUDIgcGFyYW1ldGVyIikpCgkJcmV0dXJuIDE7CglpZiAoY2hlY2tfb3ZlcmZsb3cobTEsIEZQX0RJVklTT1JfTUFTSywgIlBMTCBNMSBwYXJhbWV0ZXIiKSkKCQlyZXR1cm4gMTsKCWlmIChjaGVja19vdmVyZmxvdyhtMiwgRlBfRElWSVNPUl9NQVNLLCAiUExMIE0yIHBhcmFtZXRlciIpKQoJCXJldHVybiAxOwoJaWYgKGNoZWNrX292ZXJmbG93KG4sIEZQX0RJVklTT1JfTUFTSywgIlBMTCBOIHBhcmFtZXRlciIpKQoJCXJldHVybiAxOwoKCSpkcGxsICY9IH5EUExMX1AxX0ZPUkNFX0RJVjI7CgkqZHBsbCAmPSB+KChEUExMX1AyX01BU0sgPDwgRFBMTF9QMl9TSElGVCkgfAoJCSAgIChEUExMX1AxX01BU0sgPDwgRFBMTF9QMV9TSElGVCkpOwoJKmRwbGwgfD0gKHAyIDw8IERQTExfUDJfU0hJRlQpIHwgKHAxIDw8IERQTExfUDFfU0hJRlQpOwoJKmZwMCA9IChuIDw8IEZQX05fRElWSVNPUl9TSElGVCkgfAoJICAgICAgIChtMSA8PCBGUF9NMV9ESVZJU09SX1NISUZUKSB8CgkgICAgICAgKG0yIDw8IEZQX00yX0RJVklTT1JfU0hJRlQpOwoJKmZwMSA9ICpmcDA7CgoJaHctPmR2b2IgJj0gflBPUlRfRU5BQkxFOwoJaHctPmR2b2MgJj0gflBPUlRfRU5BQkxFOwoKCS8qIFVzZSBkaXNwbGF5IHBsYW5lIEEuICovCglody0+ZGlzcF9hX2N0cmwgfD0gRElTUFBMQU5FX1BMQU5FX0VOQUJMRTsKCWh3LT5kaXNwX2FfY3RybCAmPSB+RElTUFBMQU5FX0dBTU1BX0VOQUJMRTsKCWh3LT5kaXNwX2FfY3RybCAmPSB+RElTUFBMQU5FX1BJWEZPUk1BVF9NQVNLOwoJc3dpdGNoIChpbnRlbGZiX3Zhcl90b19kZXB0aCh2YXIpKSB7CgljYXNlIDg6CgkJaHctPmRpc3BfYV9jdHJsIHw9IERJU1BQTEFORV84QlBQIHwgRElTUFBMQU5FX0dBTU1BX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgMTU6CgkJaHctPmRpc3BfYV9jdHJsIHw9IERJU1BQTEFORV8xNV8xNkJQUDsKCQlicmVhazsKCWNhc2UgMTY6CgkJaHctPmRpc3BfYV9jdHJsIHw9IERJU1BQTEFORV8xNkJQUDsKCQlicmVhazsKCWNhc2UgMjQ6CgkJaHctPmRpc3BfYV9jdHJsIHw9IERJU1BQTEFORV8zMkJQUF9OT19BTFBIQTsKCQlicmVhazsKCX0KCWh3LT5kaXNwX2FfY3RybCAmPSB+KFBJUEVfTUFTSyA8PCBESVNQUExBTkVfU0VMX1BJUEVfU0hJRlQpOwoJaHctPmRpc3BfYV9jdHJsIHw9IChwaXBlIDw8IERJU1BQTEFORV9TRUxfUElQRV9TSElGVCk7CgoJLyogU2V0IENSVEMgcmVnaXN0ZXJzLiAqLwoJaGFjdGl2ZSA9IHZhci0+eHJlczsKCWhzeW5jX3N0YXJ0ID0gaGFjdGl2ZSArIHZhci0+cmlnaHRfbWFyZ2luOwoJaHN5bmNfZW5kID0gaHN5bmNfc3RhcnQgKyB2YXItPmhzeW5jX2xlbjsKCWh0b3RhbCA9IGhzeW5jX2VuZCArIHZhci0+bGVmdF9tYXJnaW47CgloYmxhbmtfc3RhcnQgPSBoYWN0aXZlOwoJaGJsYW5rX2VuZCA9IGh0b3RhbDsKCglEQkdfTVNHKCJIOiBhY3QgJWQsIHNzICVkLCBzZSAlZCwgdG90ICVkIGJzICVkLCBiZSAlZFxuIiwKCQloYWN0aXZlLCBoc3luY19zdGFydCwgaHN5bmNfZW5kLCBodG90YWwsIGhibGFua19zdGFydCwKCQloYmxhbmtfZW5kKTsKCgl2YWN0aXZlID0gdmFyLT55cmVzOwoJdnN5bmNfc3RhcnQgPSB2YWN0aXZlICsgdmFyLT5sb3dlcl9tYXJnaW47Cgl2c3luY19lbmQgPSB2c3luY19zdGFydCArIHZhci0+dnN5bmNfbGVuOwoJdnRvdGFsID0gdnN5bmNfZW5kICsgdmFyLT51cHBlcl9tYXJnaW47Cgl2Ymxhbmtfc3RhcnQgPSB2YWN0aXZlOwoJdmJsYW5rX2VuZCA9IHZ0b3RhbDsKCXZibGFua19lbmQgPSB2c3luY19lbmQgKyAxOwoKCURCR19NU0coIlY6IGFjdCAlZCwgc3MgJWQsIHNlICVkLCB0b3QgJWQgYnMgJWQsIGJlICVkXG4iLAoJCXZhY3RpdmUsIHZzeW5jX3N0YXJ0LCB2c3luY19lbmQsIHZ0b3RhbCwgdmJsYW5rX3N0YXJ0LAoJCXZibGFua19lbmQpOwoKCS8qIEFkanVzdCBmb3IgcmVnaXN0ZXIgdmFsdWVzLCBhbmQgY2hlY2sgZm9yIG92ZXJmbG93LiAqLwoJaGFjdGl2ZS0tOwoJaWYgKGNoZWNrX292ZXJmbG93KGhhY3RpdmUsIEhBQ1RJVkVfTUFTSywgIkNSVEMgaGFjdGl2ZSIpKQoJCXJldHVybiAxOwoJaHN5bmNfc3RhcnQtLTsKCWlmIChjaGVja19vdmVyZmxvdyhoc3luY19zdGFydCwgSFNZTkNTVEFSVF9NQVNLLCAiQ1JUQyBoc3luY19zdGFydCIpKQoJCXJldHVybiAxOwoJaHN5bmNfZW5kLS07CglpZiAoY2hlY2tfb3ZlcmZsb3coaHN5bmNfZW5kLCBIU1lOQ0VORF9NQVNLLCAiQ1JUQyBoc3luY19lbmQiKSkKCQlyZXR1cm4gMTsKCWh0b3RhbC0tOwoJaWYgKGNoZWNrX292ZXJmbG93KGh0b3RhbCwgSFRPVEFMX01BU0ssICJDUlRDIGh0b3RhbCIpKQoJCXJldHVybiAxOwoJaGJsYW5rX3N0YXJ0LS07CglpZiAoY2hlY2tfb3ZlcmZsb3coaGJsYW5rX3N0YXJ0LCBIQkxBTktTVEFSVF9NQVNLLCAiQ1JUQyBoYmxhbmtfc3RhcnQiKSkKCQlyZXR1cm4gMTsKCWhibGFua19lbmQtLTsKCWlmIChjaGVja19vdmVyZmxvdyhoYmxhbmtfZW5kLCBIQkxBTktFTkRfTUFTSywgIkNSVEMgaGJsYW5rX2VuZCIpKQoJCXJldHVybiAxOwoKCXZhY3RpdmUtLTsKCWlmIChjaGVja19vdmVyZmxvdyh2YWN0aXZlLCBWQUNUSVZFX01BU0ssICJDUlRDIHZhY3RpdmUiKSkKCQlyZXR1cm4gMTsKCXZzeW5jX3N0YXJ0LS07CglpZiAoY2hlY2tfb3ZlcmZsb3codnN5bmNfc3RhcnQsIFZTWU5DU1RBUlRfTUFTSywgIkNSVEMgdnN5bmNfc3RhcnQiKSkKCQlyZXR1cm4gMTsKCXZzeW5jX2VuZC0tOwoJaWYgKGNoZWNrX292ZXJmbG93KHZzeW5jX2VuZCwgVlNZTkNFTkRfTUFTSywgIkNSVEMgdnN5bmNfZW5kIikpCgkJcmV0dXJuIDE7Cgl2dG90YWwtLTsKCWlmIChjaGVja19vdmVyZmxvdyh2dG90YWwsIFZUT1RBTF9NQVNLLCAiQ1JUQyB2dG90YWwiKSkKCQlyZXR1cm4gMTsKCXZibGFua19zdGFydC0tOwoJaWYgKGNoZWNrX292ZXJmbG93KHZibGFua19zdGFydCwgVkJMQU5LU1RBUlRfTUFTSywgIkNSVEMgdmJsYW5rX3N0YXJ0IikpCgkJcmV0dXJuIDE7Cgl2YmxhbmtfZW5kLS07CglpZiAoY2hlY2tfb3ZlcmZsb3codmJsYW5rX2VuZCwgVkJMQU5LRU5EX01BU0ssICJDUlRDIHZibGFua19lbmQiKSkKCQlyZXR1cm4gMTsKCgkqaHQgPSAoaHRvdGFsIDw8IEhUT1RBTF9TSElGVCkgfCAoaGFjdGl2ZSA8PCBIQUNUSVZFX1NISUZUKTsKCSpoYiA9IChoYmxhbmtfc3RhcnQgPDwgSEJMQU5LU1RBUlRfU0hJRlQpIHwKCSAgICAgIChoYmxhbmtfZW5kIDw8IEhTWU5DRU5EX1NISUZUKTsKCSpocyA9IChoc3luY19zdGFydCA8PCBIU1lOQ1NUQVJUX1NISUZUKSB8IChoc3luY19lbmQgPDwgSFNZTkNFTkRfU0hJRlQpOwoKCSp2dCA9ICh2dG90YWwgPDwgVlRPVEFMX1NISUZUKSB8ICh2YWN0aXZlIDw8IFZBQ1RJVkVfU0hJRlQpOwoJKnZiID0gKHZibGFua19zdGFydCA8PCBWQkxBTktTVEFSVF9TSElGVCkgfAoJICAgICAgKHZibGFua19lbmQgPDwgVlNZTkNFTkRfU0hJRlQpOwoJKnZzID0gKHZzeW5jX3N0YXJ0IDw8IFZTWU5DU1RBUlRfU0hJRlQpIHwgKHZzeW5jX2VuZCA8PCBWU1lOQ0VORF9TSElGVCk7Cgkqc3MgPSAoaGFjdGl2ZSA8PCBTUkNfU0laRV9IT1JJWl9TSElGVCkgfAoJICAgICAgKHZhY3RpdmUgPDwgU1JDX1NJWkVfVkVSVF9TSElGVCk7CgoJaHctPmRpc3BfYV9zdHJpZGUgPSB2YXItPnhyZXNfdmlydHVhbCAqIHZhci0+Yml0c19wZXJfcGl4ZWwgLyA4OwoJREJHX01TRygicGl0Y2ggaXMgJWRcbiIsIGh3LT5kaXNwX2Ffc3RyaWRlKTsKCglody0+ZGlzcF9hX2Jhc2UgPSBody0+ZGlzcF9hX3N0cmlkZSAqIHZhci0+eW9mZnNldCArCgkJCSAgdmFyLT54b2Zmc2V0ICogdmFyLT5iaXRzX3Blcl9waXhlbCAvIDg7CgoJaHctPmRpc3BfYV9iYXNlICs9IGRpbmZvLT5mYi5vZmZzZXQgPDwgMTI7CgoJLyogQ2hlY2sgc3RyaWRlIGFsaWdubWVudC4gKi8KCWlmIChody0+ZGlzcF9hX3N0cmlkZSAlIFNUUklERV9BTElHTk1FTlQgIT0gMCkgewoJCVdSTl9NU0coImRpc3BsYXkgc3RyaWRlICVkIGhhcyBiYWQgYWxpZ25tZW50ICVkXG4iLAoJCQlody0+ZGlzcF9hX3N0cmlkZSwgU1RSSURFX0FMSUdOTUVOVCk7CgkJcmV0dXJuIDE7Cgl9CgoJLyogU2V0IHRoZSBwYWxldHRlIHRvIDgtYml0IG1vZGUuICovCgkqcGlwZV9jb25mICY9IH5QSVBFQ09ORl9HQU1NQTsKCXJldHVybiAwOwp9CgovKiBQcm9ncmFtIGEgKG5vbi1WR0EpIHZpZGVvIG1vZGUuICovCmludAppbnRlbGZiaHdfcHJvZ3JhbV9tb2RlKHN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvLAoJCSAgICAgY29uc3Qgc3RydWN0IGludGVsZmJfaHdzdGF0ZSAqaHcsIGludCBibGFuaykKewoJaW50IHBpcGUgPSBQSVBFX0E7Cgl1MzIgdG1wOwoJY29uc3QgdTMyICpkcGxsLCAqZnAwLCAqZnAxLCAqcGlwZV9jb25mOwoJY29uc3QgdTMyICpocywgKmh0LCAqaGIsICp2cywgKnZ0LCAqdmIsICpzczsKCXUzMiBkcGxsX3JlZywgZnAwX3JlZywgZnAxX3JlZywgcGlwZV9jb25mX3JlZzsKCXUzMiBoc3luY19yZWcsIGh0b3RhbF9yZWcsIGhibGFua19yZWc7Cgl1MzIgdnN5bmNfcmVnLCB2dG90YWxfcmVnLCB2YmxhbmtfcmVnOwoJdTMyIHNyY19zaXplX3JlZzsKCgkvKiBBc3N1bWUgc2luZ2xlIHBpcGUsIGRpc3BsYXkgcGxhbmUgQSwgYW5hbG9nIENSVC4gKi8KCiNpZiBWRVJCT1NFID4gMAoJREJHX01TRygiaW50ZWxmYmh3X3Byb2dyYW1fbW9kZVxuIik7CiNlbmRpZgoKCS8qIERpc2FibGUgVkdBICovCgl0bXAgPSBJTlJFRyhWR0FDTlRSTCk7Cgl0bXAgfD0gVkdBX0RJU0FCTEU7CglPVVRSRUcoVkdBQ05UUkwsIHRtcCk7CgoJLyogQ2hlY2sgd2hldGhlciBwaXBlIEEgb3IgcGlwZSBCIGlzIGVuYWJsZWQuICovCglpZiAoaHctPnBpcGVfYV9jb25mICYgUElQRUNPTkZfRU5BQkxFKQoJCXBpcGUgPSBQSVBFX0E7CgllbHNlIGlmIChody0+cGlwZV9iX2NvbmYgJiBQSVBFQ09ORl9FTkFCTEUpCgkJcGlwZSA9IFBJUEVfQjsKCglkaW5mby0+cGlwZSA9IHBpcGU7CgoJaWYgKHBpcGUgPT0gUElQRV9CKSB7CgkJZHBsbCA9ICZody0+ZHBsbF9iOwoJCWZwMCA9ICZody0+ZnBiMDsKCQlmcDEgPSAmaHctPmZwYjE7CgkJcGlwZV9jb25mID0gJmh3LT5waXBlX2JfY29uZjsKCQlocyA9ICZody0+aHN5bmNfYjsKCQloYiA9ICZody0+aGJsYW5rX2I7CgkJaHQgPSAmaHctPmh0b3RhbF9iOwoJCXZzID0gJmh3LT52c3luY19iOwoJCXZiID0gJmh3LT52YmxhbmtfYjsKCQl2dCA9ICZody0+dnRvdGFsX2I7CgkJc3MgPSAmaHctPnNyY19zaXplX2I7CgkJZHBsbF9yZWcgPSBEUExMX0I7CgkJZnAwX3JlZyA9IEZQQjA7CgkJZnAxX3JlZyA9IEZQQjE7CgkJcGlwZV9jb25mX3JlZyA9IFBJUEVCQ09ORjsKCQloc3luY19yZWcgPSBIU1lOQ19COwoJCWh0b3RhbF9yZWcgPSBIVE9UQUxfQjsKCQloYmxhbmtfcmVnID0gSEJMQU5LX0I7CgkJdnN5bmNfcmVnID0gVlNZTkNfQjsKCQl2dG90YWxfcmVnID0gVlRPVEFMX0I7CgkJdmJsYW5rX3JlZyA9IFZCTEFOS19COwoJCXNyY19zaXplX3JlZyA9IFNSQ19TSVpFX0I7Cgl9IGVsc2UgewoJCWRwbGwgPSAmaHctPmRwbGxfYTsKCQlmcDAgPSAmaHctPmZwYTA7CgkJZnAxID0gJmh3LT5mcGExOwoJCXBpcGVfY29uZiA9ICZody0+cGlwZV9hX2NvbmY7CgkJaHMgPSAmaHctPmhzeW5jX2E7CgkJaGIgPSAmaHctPmhibGFua19hOwoJCWh0ID0gJmh3LT5odG90YWxfYTsKCQl2cyA9ICZody0+dnN5bmNfYTsKCQl2YiA9ICZody0+dmJsYW5rX2E7CgkJdnQgPSAmaHctPnZ0b3RhbF9hOwoJCXNzID0gJmh3LT5zcmNfc2l6ZV9hOwoJCWRwbGxfcmVnID0gRFBMTF9BOwoJCWZwMF9yZWcgPSBGUEEwOwoJCWZwMV9yZWcgPSBGUEExOwoJCXBpcGVfY29uZl9yZWcgPSBQSVBFQUNPTkY7CgkJaHN5bmNfcmVnID0gSFNZTkNfQTsKCQlodG90YWxfcmVnID0gSFRPVEFMX0E7CgkJaGJsYW5rX3JlZyA9IEhCTEFOS19BOwoJCXZzeW5jX3JlZyA9IFZTWU5DX0E7CgkJdnRvdGFsX3JlZyA9IFZUT1RBTF9BOwoJCXZibGFua19yZWcgPSBWQkxBTktfQTsKCQlzcmNfc2l6ZV9yZWcgPSBTUkNfU0laRV9BOwoJfQoKCS8qIERpc2FibGUgcGxhbmVzIEEgYW5kIEIuICovCgl0bXAgPSBJTlJFRyhEU1BBQ05UUik7Cgl0bXAgJj0gfkRJU1BQTEFORV9QTEFORV9FTkFCTEU7CglPVVRSRUcoRFNQQUNOVFIsIHRtcCk7Cgl0bXAgPSBJTlJFRyhEU1BCQ05UUik7Cgl0bXAgJj0gfkRJU1BQTEFORV9QTEFORV9FTkFCTEU7CglPVVRSRUcoRFNQQkNOVFIsIHRtcCk7CgoJLyogV2FpdCBmb3IgdmJsYW5rLiAgRm9yIG5vdywganVzdCB3YWl0IGZvciBhIDUwSHogY3ljbGUgKDIwbXMpKSAqLwoJbWRlbGF5KDIwKTsKCgkvKiBEaXNhYmxlIFN5bmMgKi8KCXRtcCA9IElOUkVHKEFEUEEpOwoJdG1wICY9IH5BRFBBX0RQTVNfQ09OVFJPTF9NQVNLOwoJdG1wIHw9IEFEUEFfRFBNU19EMzsKCU9VVFJFRyhBRFBBLCB0bXApOwoKCS8qIHR1cm4gb2ZmIHBpcGUgKi8KCXRtcCA9IElOUkVHKHBpcGVfY29uZl9yZWcpOwoJdG1wICY9IH5QSVBFQ09ORl9FTkFCTEU7CglPVVRSRUcocGlwZV9jb25mX3JlZywgdG1wKTsKCgkvKiB0dXJuIG9mZiBQTEwgKi8KCXRtcCA9IElOUkVHKGRwbGxfcmVnKTsKCWRwbGxfcmVnICY9IH5EUExMX1ZDT19FTkFCTEU7CglPVVRSRUcoZHBsbF9yZWcsIHRtcCk7CgoJLyogU2V0IFBMTCBwYXJhbWV0ZXJzICovCglPVVRSRUcoZHBsbF9yZWcsICpkcGxsICYgfkRQTExfVkNPX0VOQUJMRSk7CglPVVRSRUcoZnAwX3JlZywgKmZwMCk7CglPVVRSRUcoZnAxX3JlZywgKmZwMSk7CgoJLyogU2V0IHBpcGUgcGFyYW1ldGVycyAqLwoJT1VUUkVHKGhzeW5jX3JlZywgKmhzKTsKCU9VVFJFRyhoYmxhbmtfcmVnLCAqaGIpOwoJT1VUUkVHKGh0b3RhbF9yZWcsICpodCk7CglPVVRSRUcodnN5bmNfcmVnLCAqdnMpOwoJT1VUUkVHKHZibGFua19yZWcsICp2Yik7CglPVVRSRUcodnRvdGFsX3JlZywgKnZ0KTsKCU9VVFJFRyhzcmNfc2l6ZV9yZWcsICpzcyk7CgoJLyogU2V0IERWT3MgQi9DICovCglPVVRSRUcoRFZPQiwgaHctPmR2b2IpOwoJT1VUUkVHKERWT0MsIGh3LT5kdm9jKTsKCgkvKiBTZXQgQURQQSAqLwoJT1VUUkVHKEFEUEEsIChody0+YWRwYSAmIH4oQURQQV9EUE1TX0NPTlRST0xfTUFTSykpIHwgQURQQV9EUE1TX0QzKTsKCgkvKiBFbmFibGUgUExMICovCgl0bXAgPSBJTlJFRyhkcGxsX3JlZyk7Cgl0bXAgfD0gRFBMTF9WQ09fRU5BQkxFOwoJT1VUUkVHKGRwbGxfcmVnLCB0bXApOwoKCS8qIEVuYWJsZSBwaXBlICovCglPVVRSRUcocGlwZV9jb25mX3JlZywgKnBpcGVfY29uZiB8IFBJUEVDT05GX0VOQUJMRSk7CgoJLyogRW5hYmxlIHN5bmMgKi8KCXRtcCA9IElOUkVHKEFEUEEpOwoJdG1wICY9IH5BRFBBX0RQTVNfQ09OVFJPTF9NQVNLOwoJdG1wIHw9IEFEUEFfRFBNU19EMDsKCU9VVFJFRyhBRFBBLCB0bXApOwoKCS8qIHNldHVwIGRpc3BsYXkgcGxhbmUgKi8KCWlmIChkaW5mby0+cGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODMwTSkgewoJCS8qCgkJICogICAgICBpODMwTSBlcnJhdGE6IHRoZSBkaXNwbGF5IHBsYW5lIG11c3QgYmUgZW5hYmxlZAoJCSAqICAgICAgdG8gYWxsb3cgd3JpdGVzIHRvIHRoZSBvdGhlciBiaXRzIGluIHRoZSBwbGFuZQoJCSAqICAgICAgY29udHJvbCByZWdpc3Rlci4KCQkgKi8KCQl0bXAgPSBJTlJFRyhEU1BBQ05UUik7CgkJaWYgKCh0bXAgJiBESVNQUExBTkVfUExBTkVfRU5BQkxFKSAhPSBESVNQUExBTkVfUExBTkVfRU5BQkxFKSB7CgkJCXRtcCB8PSBESVNQUExBTkVfUExBTkVfRU5BQkxFOwoJCQlPVVRSRUcoRFNQQUNOVFIsIHRtcCk7CgkJCU9VVFJFRyhEU1BBQ05UUiwKCQkJICAgICAgIGh3LT5kaXNwX2FfY3RybHxESVNQUExBTkVfUExBTkVfRU5BQkxFKTsKCQkJbWRlbGF5KDEpOwogICAgICAgICAgICAgIH0KCX0KCglPVVRSRUcoRFNQQUNOVFIsIGh3LT5kaXNwX2FfY3RybCAmIH5ESVNQUExBTkVfUExBTkVfRU5BQkxFKTsKCU9VVFJFRyhEU1BBU1RSSURFLCBody0+ZGlzcF9hX3N0cmlkZSk7CglPVVRSRUcoRFNQQUJBU0UsIGh3LT5kaXNwX2FfYmFzZSk7CgoJLyogRW5hYmxlIHBsYW5lICovCglpZiAoIWJsYW5rKSB7CgkJdG1wID0gSU5SRUcoRFNQQUNOVFIpOwoJCXRtcCB8PSBESVNQUExBTkVfUExBTkVfRU5BQkxFOwoJCU9VVFJFRyhEU1BBQ05UUiwgdG1wKTsKCQlPVVRSRUcoRFNQQUJBU0UsIGh3LT5kaXNwX2FfYmFzZSk7Cgl9CgoJcmV0dXJuIDA7Cn0KCi8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCnN0YXRpYyB2b2lkIHJlZnJlc2hfcmluZyhzdHJ1Y3QgaW50ZWxmYl9pbmZvICpkaW5mbyk7CnN0YXRpYyB2b2lkIHJlc2V0X3N0YXRlKHN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvKTsKc3RhdGljIHZvaWQgZG9fZmx1c2goc3RydWN0IGludGVsZmJfaW5mbyAqZGluZm8pOwoKc3RhdGljIGludAp3YWl0X3Jpbmcoc3RydWN0IGludGVsZmJfaW5mbyAqZGluZm8sIGludCBuKQp7CglpbnQgaSA9IDA7Cgl1bnNpZ25lZCBsb25nIGVuZDsKCXUzMiBsYXN0X2hlYWQgPSBJTlJFRyhQUklfUklOR19IRUFEKSAmIFJJTkdfSEVBRF9NQVNLOwoKI2lmIFZFUkJPU0UgPiAwCglEQkdfTVNHKCJ3YWl0X3Jpbmc6ICVkXG4iLCBuKTsKI2VuZGlmCgoJZW5kID0gamlmZmllcyArIChIWiAqIDMpOwoJd2hpbGUgKGRpbmZvLT5yaW5nX3NwYWNlIDwgbikgewoJCWRpbmZvLT5yaW5nX2hlYWQgPSAodTggX19pb21lbSAqKShJTlJFRyhQUklfUklOR19IRUFEKSAmCgkJCQkJCSAgIFJJTkdfSEVBRF9NQVNLKTsKCQlpZiAoZGluZm8tPnJpbmdfdGFpbCArIFJJTkdfTUlOX0ZSRUUgPAoJCSAgICAodTMyIF9faW9tZW0pIGRpbmZvLT5yaW5nX2hlYWQpCgkJCWRpbmZvLT5yaW5nX3NwYWNlID0gKHUzMiBfX2lvbWVtKSBkaW5mby0+cmluZ19oZWFkCgkJCQktIChkaW5mby0+cmluZ190YWlsICsgUklOR19NSU5fRlJFRSk7CgkJZWxzZQoJCQlkaW5mby0+cmluZ19zcGFjZSA9IChkaW5mby0+cmluZy5zaXplICsKCQkJCQkgICAgICh1MzIgX19pb21lbSkgZGluZm8tPnJpbmdfaGVhZCkKCQkJCS0gKGRpbmZvLT5yaW5nX3RhaWwgKyBSSU5HX01JTl9GUkVFKTsKCQlpZiAoKHUzMiBfX2lvbWVtKSBkaW5mby0+cmluZ19oZWFkICE9IGxhc3RfaGVhZCkgewoJCQllbmQgPSBqaWZmaWVzICsgKEhaICogMyk7CgkJCWxhc3RfaGVhZCA9ICh1MzIgX19pb21lbSkgZGluZm8tPnJpbmdfaGVhZDsKCQl9CgkJaSsrOwoJCWlmICh0aW1lX2JlZm9yZShlbmQsIGppZmZpZXMpKSB7CgkJCWlmICghaSkgewoJCQkJLyogVHJ5IGFnYWluICovCgkJCQlyZXNldF9zdGF0ZShkaW5mbyk7CgkJCQlyZWZyZXNoX3JpbmcoZGluZm8pOwoJCQkJZG9fZmx1c2goZGluZm8pOwoJCQkJZW5kID0gamlmZmllcyArIChIWiAqIDMpOwoJCQkJaSA9IDE7CgkJCX0gZWxzZSB7CgkJCQlXUk5fTVNHKCJyaW5nIGJ1ZmZlciA6IHNwYWNlOiAlZCB3YW50ZWQgJWRcbiIsCgkJCQkJZGluZm8tPnJpbmdfc3BhY2UsIG4pOwoJCQkJV1JOX01TRygibG9ja3VwIC0gdHVybmluZyBvZmYgaGFyZHdhcmUgIgoJCQkJCSJhY2NlbGVyYXRpb25cbiIpOwoJCQkJZGluZm8tPnJpbmdfbG9ja3VwID0gMTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCXVkZWxheSgxKTsKCX0KCXJldHVybiBpOwp9CgpzdGF0aWMgdm9pZApkb19mbHVzaChzdHJ1Y3QgaW50ZWxmYl9pbmZvICpkaW5mbykgewoJU1RBUlRfUklORygyKTsKCU9VVF9SSU5HKE1JX0ZMVVNIIHwgTUlfV1JJVEVfRElSVFlfU1RBVEUgfCBNSV9JTlZBTElEQVRFX01BUF9DQUNIRSk7CglPVVRfUklORyhNSV9OT09QKTsKCUFEVkFOQ0VfUklORygpOwp9Cgp2b2lkCmludGVsZmJod19kb19zeW5jKHN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvKQp7CiNpZiBWRVJCT1NFID4gMAoJREJHX01TRygiaW50ZWxmYmh3X2RvX3N5bmNcbiIpOwojZW5kaWYKCglpZiAoIWRpbmZvLT5hY2NlbCkKCQlyZXR1cm47CgoJLyoKCSAqIFNlbmQgYSBmbHVzaCwgdGhlbiB3YWl0IHVudGlsIHRoZSByaW5nIGlzIGVtcHR5LiAgVGhpcyBpcyB3aGF0CgkgKiB0aGUgWEZyZWU4NiBkcml2ZXIgZG9lcywgYW5kIGFjdHVhbGx5IGl0IGRvZXNuJ3Qgc2VlbSBhIGxvdCB3b3JzZQoJICogdGhhbiB0aGUgcmVjb21tZW5kZWQgbWV0aG9kIChib3RoIGhhdmUgcHJvYmxlbXMpLgoJICovCglkb19mbHVzaChkaW5mbyk7Cgl3YWl0X3JpbmcoZGluZm8sIGRpbmZvLT5yaW5nLnNpemUgLSBSSU5HX01JTl9GUkVFKTsKCWRpbmZvLT5yaW5nX3NwYWNlID0gZGluZm8tPnJpbmcuc2l6ZSAtIFJJTkdfTUlOX0ZSRUU7Cn0KCnN0YXRpYyB2b2lkCnJlZnJlc2hfcmluZyhzdHJ1Y3QgaW50ZWxmYl9pbmZvICpkaW5mbykKewojaWYgVkVSQk9TRSA+IDAKCURCR19NU0coInJlZnJlc2hfcmluZ1xuIik7CiNlbmRpZgoKCWRpbmZvLT5yaW5nX2hlYWQgPSAodTggX19pb21lbSAqKSAoSU5SRUcoUFJJX1JJTkdfSEVBRCkgJgoJCQkJCSAgIFJJTkdfSEVBRF9NQVNLKTsKCWRpbmZvLT5yaW5nX3RhaWwgPSBJTlJFRyhQUklfUklOR19UQUlMKSAmIFJJTkdfVEFJTF9NQVNLOwoJaWYgKGRpbmZvLT5yaW5nX3RhaWwgKyBSSU5HX01JTl9GUkVFIDwgKHUzMiBfX2lvbWVtKWRpbmZvLT5yaW5nX2hlYWQpCgkJZGluZm8tPnJpbmdfc3BhY2UgPSAodTMyIF9faW9tZW0pIGRpbmZvLT5yaW5nX2hlYWQKCQkJLSAoZGluZm8tPnJpbmdfdGFpbCArIFJJTkdfTUlOX0ZSRUUpOwoJZWxzZQoJCWRpbmZvLT5yaW5nX3NwYWNlID0gKGRpbmZvLT5yaW5nLnNpemUgKwoJCQkJICAgICAodTMyIF9faW9tZW0pIGRpbmZvLT5yaW5nX2hlYWQpCgkJCS0gKGRpbmZvLT5yaW5nX3RhaWwgKyBSSU5HX01JTl9GUkVFKTsKfQoKc3RhdGljIHZvaWQKcmVzZXRfc3RhdGUoc3RydWN0IGludGVsZmJfaW5mbyAqZGluZm8pCnsKCWludCBpOwoJdTMyIHRtcDsKCiNpZiBWRVJCT1NFID4gMAoJREJHX01TRygicmVzZXRfc3RhdGVcbiIpOwojZW5kaWYKCglmb3IgKGkgPSAwOyBpIDwgRkVOQ0VfTlVNOyBpKyspCgkJT1VUUkVHKEZFTkNFICsgKGkgPDwgMiksIDApOwoKCS8qIEZsdXNoIHRoZSByaW5nIGJ1ZmZlciBpZiBpdCdzIGVuYWJsZWQuICovCgl0bXAgPSBJTlJFRyhQUklfUklOR19MRU5HVEgpOwoJaWYgKHRtcCAmIFJJTkdfRU5BQkxFKSB7CiNpZiBWRVJCT1NFID4gMAoJCURCR19NU0coInJlc2V0X3N0YXRlOiByaW5nIHdhcyBlbmFibGVkXG4iKTsKI2VuZGlmCgkJcmVmcmVzaF9yaW5nKGRpbmZvKTsKCQlpbnRlbGZiaHdfZG9fc3luYyhkaW5mbyk7CgkJRE9fUklOR19JRExFKCk7Cgl9CgoJT1VUUkVHKFBSSV9SSU5HX0xFTkdUSCwgMCk7CglPVVRSRUcoUFJJX1JJTkdfSEVBRCwgMCk7CglPVVRSRUcoUFJJX1JJTkdfVEFJTCwgMCk7CglPVVRSRUcoUFJJX1JJTkdfU1RBUlQsIDApOwp9CgovKiBTdG9wIHRoZSAyRCBlbmdpbmUsIGFuZCB0dXJuIG9mZiB0aGUgcmluZyBidWZmZXIuICovCnZvaWQKaW50ZWxmYmh3XzJkX3N0b3Aoc3RydWN0IGludGVsZmJfaW5mbyAqZGluZm8pCnsKI2lmIFZFUkJPU0UgPiAwCglEQkdfTVNHKCJpbnRlbGZiaHdfMmRfc3RvcDogYWNjZWw6ICVkLCByaW5nX2FjdGl2ZTogJWRcbiIsIGRpbmZvLT5hY2NlbCwKCQlkaW5mby0+cmluZ19hY3RpdmUpOwojZW5kaWYKCglpZiAoIWRpbmZvLT5hY2NlbCkKCQlyZXR1cm47CgoJZGluZm8tPnJpbmdfYWN0aXZlID0gMDsKCXJlc2V0X3N0YXRlKGRpbmZvKTsKfQoKLyoKICogRW5hYmxlIHRoZSByaW5nIGJ1ZmZlciwgYW5kIGluaXRpYWxpc2UgdGhlIDJEIGVuZ2luZS4KICogSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBncmFwaGljcyBlbmdpbmUgaGFzIGJlZW4gc3RvcHBlZCBieSBwcmV2aW91c2x5CiAqIGNhbGxpbmcgaW50ZWxmYl8yZF9zdG9wKCkuCiAqLwp2b2lkCmludGVsZmJod18yZF9zdGFydChzdHJ1Y3QgaW50ZWxmYl9pbmZvICpkaW5mbykKewojaWYgVkVSQk9TRSA+IDAKCURCR19NU0coImludGVsZmJod18yZF9zdGFydDogYWNjZWw6ICVkLCByaW5nX2FjdGl2ZTogJWRcbiIsCgkJZGluZm8tPmFjY2VsLCBkaW5mby0+cmluZ19hY3RpdmUpOwojZW5kaWYKCglpZiAoIWRpbmZvLT5hY2NlbCkKCQlyZXR1cm47CgoJLyogSW5pdGlhbGlzZSB0aGUgcHJpbWFyeSByaW5nIGJ1ZmZlci4gKi8KCU9VVFJFRyhQUklfUklOR19MRU5HVEgsIDApOwoJT1VUUkVHKFBSSV9SSU5HX1RBSUwsIDApOwoJT1VUUkVHKFBSSV9SSU5HX0hFQUQsIDApOwoKCU9VVFJFRyhQUklfUklOR19TVEFSVCwgZGluZm8tPnJpbmcucGh5c2ljYWwgJiBSSU5HX1NUQVJUX01BU0spOwoJT1VUUkVHKFBSSV9SSU5HX0xFTkdUSCwKCQkoKGRpbmZvLT5yaW5nLnNpemUgLSBHVFRfUEFHRV9TSVpFKSAmIFJJTkdfTEVOR1RIX01BU0spIHwKCQlSSU5HX05PX1JFUE9SVCB8IFJJTkdfRU5BQkxFKTsKCXJlZnJlc2hfcmluZyhkaW5mbyk7CglkaW5mby0+cmluZ19hY3RpdmUgPSAxOwp9CgovKiAyRCBmaWxscmVjdCAoc29saWQgZmlsbCBvciBpbnZlcnQpICovCnZvaWQKaW50ZWxmYmh3X2RvX2ZpbGxyZWN0KHN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvLCB1MzIgeCwgdTMyIHksIHUzMiB3LCB1MzIgaCwKCQkgICAgICB1MzIgY29sb3IsIHUzMiBwaXRjaCwgdTMyIGJwcCwgdTMyIHJvcCkKewoJdTMyIGJyMDAsIGJyMDksIGJyMTMsIGJyMTQsIGJyMTY7CgojaWYgVkVSQk9TRSA+IDAKCURCR19NU0coImludGVsZmJod19kb19maWxscmVjdDogKCVkLCVkKSAlZHglZCwgYyAweCUwNngsIHAgJWQgYnBwICVkLCAiCgkJInJvcCAweCUwMnhcbiIsIHgsIHksIHcsIGgsIGNvbG9yLCBwaXRjaCwgYnBwLCByb3ApOwojZW5kaWYKCglicjAwID0gQ09MT1JfQkxUX0NNRDsKCWJyMDkgPSBkaW5mby0+ZmJfc3RhcnQgKyAoeSAqIHBpdGNoICsgeCAqIChicHAgLyA4KSk7CglicjEzID0gKHJvcCA8PCBST1BfU0hJRlQpIHwgcGl0Y2g7CglicjE0ID0gKGggPDwgSEVJR0hUX1NISUZUKSB8ICgodyAqIChicHAgLyA4KSkgPDwgV0lEVEhfU0hJRlQpOwoJYnIxNiA9IGNvbG9yOwoKCXN3aXRjaCAoYnBwKSB7CgljYXNlIDg6CgkJYnIxMyB8PSBDT0xPUl9ERVBUSF84OwoJCWJyZWFrOwoJY2FzZSAxNjoKCQlicjEzIHw9IENPTE9SX0RFUFRIXzE2OwoJCWJyZWFrOwoJY2FzZSAzMjoKCQlicjEzIHw9IENPTE9SX0RFUFRIXzMyOwoJCWJyMDAgfD0gV1JJVEVfQUxQSEEgfCBXUklURV9SR0I7CgkJYnJlYWs7Cgl9CgoJU1RBUlRfUklORyg2KTsKCU9VVF9SSU5HKGJyMDApOwoJT1VUX1JJTkcoYnIxMyk7CglPVVRfUklORyhicjE0KTsKCU9VVF9SSU5HKGJyMDkpOwoJT1VUX1JJTkcoYnIxNik7CglPVVRfUklORyhNSV9OT09QKTsKCUFEVkFOQ0VfUklORygpOwoKI2lmIFZFUkJPU0UgPiAwCglEQkdfTVNHKCJyaW5nID0gMHglMDh4LCAweCUwOHggKCVkKVxuIiwgZGluZm8tPnJpbmdfaGVhZCwKCQlkaW5mby0+cmluZ190YWlsLCBkaW5mby0+cmluZ19zcGFjZSk7CiNlbmRpZgp9Cgp2b2lkCmludGVsZmJod19kb19iaXRibHQoc3RydWN0IGludGVsZmJfaW5mbyAqZGluZm8sIHUzMiBjdXJ4LCB1MzIgY3VyeSwKCQkgICAgdTMyIGRzdHgsIHUzMiBkc3R5LCB1MzIgdywgdTMyIGgsIHUzMiBwaXRjaCwgdTMyIGJwcCkKewoJdTMyIGJyMDAsIGJyMDksIGJyMTEsIGJyMTIsIGJyMTMsIGJyMjIsIGJyMjMsIGJyMjY7CgojaWYgVkVSQk9TRSA+IDAKCURCR19NU0coImludGVsZmJod19kb19iaXRibHQ6ICglZCwlZCktPiglZCwlZCkgJWR4JWQsIHAgJWQgYnBwICVkXG4iLAoJCWN1cngsIGN1cnksIGRzdHgsIGRzdHksIHcsIGgsIHBpdGNoLCBicHApOwojZW5kaWYKCglicjAwID0gWFlfU1JDX0NPUFlfQkxUX0NNRDsKCWJyMDkgPSBkaW5mby0+ZmJfc3RhcnQ7CglicjExID0gKHBpdGNoIDw8IFBJVENIX1NISUZUKTsKCWJyMTIgPSBkaW5mby0+ZmJfc3RhcnQ7CglicjEzID0gKFNSQ19ST1BfR1hDT1BZIDw8IFJPUF9TSElGVCkgfCAocGl0Y2ggPDwgUElUQ0hfU0hJRlQpOwoJYnIyMiA9IChkc3R4IDw8IFdJRFRIX1NISUZUKSB8IChkc3R5IDw8IEhFSUdIVF9TSElGVCk7CglicjIzID0gKChkc3R4ICsgdykgPDwgV0lEVEhfU0hJRlQpIHwKCSAgICAgICAoKGRzdHkgKyBoKSA8PCBIRUlHSFRfU0hJRlQpOwoJYnIyNiA9IChjdXJ4IDw8IFdJRFRIX1NISUZUKSB8IChjdXJ5IDw8IEhFSUdIVF9TSElGVCk7CgoJc3dpdGNoIChicHApIHsKCWNhc2UgODoKCQlicjEzIHw9IENPTE9SX0RFUFRIXzg7CgkJYnJlYWs7CgljYXNlIDE2OgoJCWJyMTMgfD0gQ09MT1JfREVQVEhfMTY7CgkJYnJlYWs7CgljYXNlIDMyOgoJCWJyMTMgfD0gQ09MT1JfREVQVEhfMzI7CgkJYnIwMCB8PSBXUklURV9BTFBIQSB8IFdSSVRFX1JHQjsKCQlicmVhazsKCX0KCglTVEFSVF9SSU5HKDgpOwoJT1VUX1JJTkcoYnIwMCk7CglPVVRfUklORyhicjEzKTsKCU9VVF9SSU5HKGJyMjIpOwoJT1VUX1JJTkcoYnIyMyk7CglPVVRfUklORyhicjA5KTsKCU9VVF9SSU5HKGJyMjYpOwoJT1VUX1JJTkcoYnIxMSk7CglPVVRfUklORyhicjEyKTsKCUFEVkFOQ0VfUklORygpOwp9CgppbnQKaW50ZWxmYmh3X2RvX2RyYXdnbHlwaChzdHJ1Y3QgaW50ZWxmYl9pbmZvICpkaW5mbywgdTMyIGZnLCB1MzIgYmcsIHUzMiB3LAoJCSAgICAgICB1MzIgaCwgY29uc3QgdTgqIGNkYXQsIHUzMiB4LCB1MzIgeSwgdTMyIHBpdGNoLCB1MzIgYnBwKQp7CglpbnQgbmJ5dGVzLCBuZHdvcmRzLCBwYWQsIHRtcDsKCXUzMiBicjAwLCBicjA5LCBicjEzLCBicjE4LCBicjE5LCBicjIyLCBicjIzOwoJaW50IGRhdCwgaXgsIGl5LCBpdzsKCWludCBpLCBqOwoKI2lmIFZFUkJPU0UgPiAwCglEQkdfTVNHKCJpbnRlbGZiaHdfZG9fZHJhd2dseXBoOiAoJWQsJWQpICVkeCVkXG4iLCB4LCB5LCB3LCBoKTsKI2VuZGlmCgoJLyogc2l6ZSBpbiBieXRlcyBvZiBhIHBhZGRlZCBzY2FubGluZSAqLwoJbmJ5dGVzID0gUk9VTkRfVVBfVE8odywgMTYpIC8gODsKCgkvKiBUb3RhbCBieXRlcyBvZiBwYWRkZWQgc2NhbmxpbmUgZGF0YSB0byB3cml0ZSBvdXQuICovCgluYnl0ZXMgPSBuYnl0ZXMgKiBoOwoKCS8qCgkgKiBDaGVjayBpZiB0aGUgZ2x5cGggZGF0YSBleGNlZWRzIHRoZSBpbW1lZGlhdGUgbW9kZSBsaW1pdC4KCSAqIEl0IHdvdWxkIHRha2UgYSBsYXJnZSBmb250ICgxSyBwaXhlbHMpIHRvIGhpdCB0aGlzIGxpbWl0LgoJICovCglpZiAobmJ5dGVzID4gTUFYX01PTk9fSU1NX1NJWkUpCgkJcmV0dXJuIDA7CgoJLyogU3JjIGRhdGEgaXMgcGFja2FnZWQgYSBkd29yZCAoMzItYml0KSBhdCBhIHRpbWUuICovCgluZHdvcmRzID0gUk9VTkRfVVBfVE8obmJ5dGVzLCA0KSAvIDQ7CgoJLyoKCSAqIFJpbmcgaGFzIHRvIGJlIHBhZGRlZCB0byBhIHF1YWQgd29yZC4gQnV0IGJlY2F1c2UgdGhlIGNvbW1hbmQgc3RhcnRzCgkgICB3aXRoIDcgYnl0ZXMsIHBhZCBvbmx5IGlmIHRoZXJlIGlzIGFuIGV2ZW4gbnVtYmVyIG9mIG5kd29yZHMKCSAqLwoJcGFkID0gIShuZHdvcmRzICUgMik7CgoJdG1wID0gKFhZX01PTk9fU1JDX0lNTV9CTFRfQ01EICYgRFdfTEVOR1RIX01BU0spICsgbmR3b3JkczsKCWJyMDAgPSAoWFlfTU9OT19TUkNfSU1NX0JMVF9DTUQgJiB+RFdfTEVOR1RIX01BU0spIHwgdG1wOwoJYnIwOSA9IGRpbmZvLT5mYl9zdGFydDsKCWJyMTMgPSAoU1JDX1JPUF9HWENPUFkgPDwgUk9QX1NISUZUKSB8IChwaXRjaCA8PCBQSVRDSF9TSElGVCk7CglicjE4ID0gYmc7CglicjE5ID0gZmc7CglicjIyID0gKHggPDwgV0lEVEhfU0hJRlQpIHwgKHkgPDwgSEVJR0hUX1NISUZUKTsKCWJyMjMgPSAoKHggKyB3KSA8PCBXSURUSF9TSElGVCkgfCAoKHkgKyBoKSA8PCBIRUlHSFRfU0hJRlQpOwoKCXN3aXRjaCAoYnBwKSB7CgljYXNlIDg6CgkJYnIxMyB8PSBDT0xPUl9ERVBUSF84OwoJCWJyZWFrOwoJY2FzZSAxNjoKCQlicjEzIHw9IENPTE9SX0RFUFRIXzE2OwoJCWJyZWFrOwoJY2FzZSAzMjoKCQlicjEzIHw9IENPTE9SX0RFUFRIXzMyOwoJCWJyMDAgfD0gV1JJVEVfQUxQSEEgfCBXUklURV9SR0I7CgkJYnJlYWs7Cgl9CgoJU1RBUlRfUklORyg4ICsgbmR3b3Jkcyk7CglPVVRfUklORyhicjAwKTsKCU9VVF9SSU5HKGJyMTMpOwoJT1VUX1JJTkcoYnIyMik7CglPVVRfUklORyhicjIzKTsKCU9VVF9SSU5HKGJyMDkpOwoJT1VUX1JJTkcoYnIxOCk7CglPVVRfUklORyhicjE5KTsKCWl4ID0gaXkgPSAwOwoJaXcgPSBST1VORF9VUF9UTyh3LCA4KSAvIDg7Cgl3aGlsZSAobmR3b3Jkcy0tKSB7CgkJZGF0ID0gMDsKCQlmb3IgKGogPSAwOyBqIDwgMjsgKytqKSB7CgkJCWZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKCQkJCWlmIChpeCAhPSBpdyB8fCBpID09IDApCgkJCQkJZGF0IHw9IGNkYXRbaXkqaXcgKyBpeCsrXSA8PCAoaStqKjIpKjg7CgkJCX0KCQkJaWYgKGl4ID09IGl3ICYmIGl5ICE9IChoLTEpKSB7CgkJCQlpeCA9IDA7CgkJCQkrK2l5OwoJCQl9CgkJfQoJCU9VVF9SSU5HKGRhdCk7Cgl9CglpZiAocGFkKQoJCU9VVF9SSU5HKE1JX05PT1ApOwoJQURWQU5DRV9SSU5HKCk7CgoJcmV0dXJuIDE7Cn0KCi8qIEhXIGN1cnNvciBmdW5jdGlvbnMuICovCnZvaWQKaW50ZWxmYmh3X2N1cnNvcl9pbml0KHN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvKQp7Cgl1MzIgdG1wOwoKI2lmIFZFUkJPU0UgPiAwCglEQkdfTVNHKCJpbnRlbGZiaHdfY3Vyc29yX2luaXRcbiIpOwojZW5kaWYKCglpZiAoZGluZm8tPm1vYmlsZSkgewoJCWlmICghZGluZm8tPmN1cnNvci5waHlzaWNhbCkKCQkJcmV0dXJuOwoJCXRtcCA9IElOUkVHKENVUlNPUl9BX0NPTlRST0wpOwoJCXRtcCAmPSB+KENVUlNPUl9NT0RFX01BU0sgfCBDVVJTT1JfTU9CSUxFX0dBTU1BX0VOQUJMRSB8CgkJCSBDVVJTT1JfTUVNX1RZUEVfTE9DQUwgfAoJCQkgKDEgPDwgQ1VSU09SX1BJUEVfU0VMRUNUX1NISUZUKSk7CgkJdG1wIHw9IENVUlNPUl9NT0RFX0RJU0FCTEU7CgkJT1VUUkVHKENVUlNPUl9BX0NPTlRST0wsIHRtcCk7CgkJT1VUUkVHKENVUlNPUl9BX0JBU0VBRERSLCBkaW5mby0+Y3Vyc29yLnBoeXNpY2FsKTsKCX0gZWxzZSB7CgkJdG1wID0gSU5SRUcoQ1VSU09SX0NPTlRST0wpOwoJCXRtcCAmPSB+KENVUlNPUl9GT1JNQVRfTUFTSyB8IENVUlNPUl9HQU1NQV9FTkFCTEUgfAoJCQkgQ1VSU09SX0VOQUJMRSB8IENVUlNPUl9TVFJJREVfTUFTSyk7CgkJdG1wID0gQ1VSU09SX0ZPUk1BVF8zQzsKCQlPVVRSRUcoQ1VSU09SX0NPTlRST0wsIHRtcCk7CgkJT1VUUkVHKENVUlNPUl9BX0JBU0VBRERSLCBkaW5mby0+Y3Vyc29yLm9mZnNldCA8PCAxMik7CgkJdG1wID0gKDY0IDw8IENVUlNPUl9TSVpFX0hfU0hJRlQpIHwKCQkgICAgICAoNjQgPDwgQ1VSU09SX1NJWkVfVl9TSElGVCk7CgkJT1VUUkVHKENVUlNPUl9TSVpFLCB0bXApOwoJfQp9Cgp2b2lkCmludGVsZmJod19jdXJzb3JfaGlkZShzdHJ1Y3QgaW50ZWxmYl9pbmZvICpkaW5mbykKewoJdTMyIHRtcDsKCiNpZiBWRVJCT1NFID4gMAoJREJHX01TRygiaW50ZWxmYmh3X2N1cnNvcl9oaWRlXG4iKTsKI2VuZGlmCgoJZGluZm8tPmN1cnNvcl9vbiA9IDA7CglpZiAoZGluZm8tPm1vYmlsZSkgewoJCWlmICghZGluZm8tPmN1cnNvci5waHlzaWNhbCkKCQkJcmV0dXJuOwoJCXRtcCA9IElOUkVHKENVUlNPUl9BX0NPTlRST0wpOwoJCXRtcCAmPSB+Q1VSU09SX01PREVfTUFTSzsKCQl0bXAgfD0gQ1VSU09SX01PREVfRElTQUJMRTsKCQlPVVRSRUcoQ1VSU09SX0FfQ09OVFJPTCwgdG1wKTsKCQkvKiBGbHVzaCBjaGFuZ2VzICovCgkJT1VUUkVHKENVUlNPUl9BX0JBU0VBRERSLCBkaW5mby0+Y3Vyc29yLnBoeXNpY2FsKTsKCX0gZWxzZSB7CgkJdG1wID0gSU5SRUcoQ1VSU09SX0NPTlRST0wpOwoJCXRtcCAmPSB+Q1VSU09SX0VOQUJMRTsKCQlPVVRSRUcoQ1VSU09SX0NPTlRST0wsIHRtcCk7Cgl9Cn0KCnZvaWQKaW50ZWxmYmh3X2N1cnNvcl9zaG93KHN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvKQp7Cgl1MzIgdG1wOwoKI2lmIFZFUkJPU0UgPiAwCglEQkdfTVNHKCJpbnRlbGZiaHdfY3Vyc29yX3Nob3dcbiIpOwojZW5kaWYKCglkaW5mby0+Y3Vyc29yX29uID0gMTsKCglpZiAoZGluZm8tPmN1cnNvcl9ibGFua2VkKQoJCXJldHVybjsKCglpZiAoZGluZm8tPm1vYmlsZSkgewoJCWlmICghZGluZm8tPmN1cnNvci5waHlzaWNhbCkKCQkJcmV0dXJuOwoJCXRtcCA9IElOUkVHKENVUlNPUl9BX0NPTlRST0wpOwoJCXRtcCAmPSB+Q1VSU09SX01PREVfTUFTSzsKCQl0bXAgfD0gQ1VSU09SX01PREVfNjRfNENfQVg7CgkJT1VUUkVHKENVUlNPUl9BX0NPTlRST0wsIHRtcCk7CgkJLyogRmx1c2ggY2hhbmdlcyAqLwoJCU9VVFJFRyhDVVJTT1JfQV9CQVNFQUREUiwgZGluZm8tPmN1cnNvci5waHlzaWNhbCk7Cgl9IGVsc2UgewoJCXRtcCA9IElOUkVHKENVUlNPUl9DT05UUk9MKTsKCQl0bXAgfD0gQ1VSU09SX0VOQUJMRTsKCQlPVVRSRUcoQ1VSU09SX0NPTlRST0wsIHRtcCk7Cgl9Cn0KCnZvaWQKaW50ZWxmYmh3X2N1cnNvcl9zZXRwb3Moc3RydWN0IGludGVsZmJfaW5mbyAqZGluZm8sIGludCB4LCBpbnQgeSkKewoJdTMyIHRtcDsKCiNpZiBWRVJCT1NFID4gMAoJREJHX01TRygiaW50ZWxmYmh3X2N1cnNvcl9zZXRwb3M6ICglZCwgJWQpXG4iLCB4LCB5KTsKI2VuZGlmCgoJLyoKCSAqIFNldHMgdGhlIHBvc2l0aW9uLiAgVGhlIGNvb3JkaW5hdGVzIGFyZSBhc3N1bWVkIHRvIGFscmVhZHkKCSAqIGhhdmUgYW55IG9mZnNldCBhZGp1c3RlZC4gIEFzc3VtZSB0aGF0IHRoZSBjdXJzb3IgaXMgbmV2ZXIKCSAqIGNvbXBsZXRlbHkgb2ZmLXNjcmVlbiwgYW5kIHRoYXQgeCwgeSBhcmUgYWx3YXlzID49IDAuCgkgKi8KCgl0bXAgPSAoKHggJiBDVVJTT1JfUE9TX01BU0spIDw8IENVUlNPUl9YX1NISUZUKSB8CgkgICAgICAoKHkgJiBDVVJTT1JfUE9TX01BU0spIDw8IENVUlNPUl9ZX1NISUZUKTsKCU9VVFJFRyhDVVJTT1JfQV9QT1NJVElPTiwgdG1wKTsKfQoKdm9pZAppbnRlbGZiaHdfY3Vyc29yX3NldGNvbG9yKHN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvLCB1MzIgYmcsIHUzMiBmZykKewojaWYgVkVSQk9TRSA+IDAKCURCR19NU0coImludGVsZmJod19jdXJzb3Jfc2V0Y29sb3JcbiIpOwojZW5kaWYKCglPVVRSRUcoQ1VSU09SX0FfUEFMRVRURTAsIGJnICYgQ1VSU09SX1BBTEVUVEVfTUFTSyk7CglPVVRSRUcoQ1VSU09SX0FfUEFMRVRURTEsIGZnICYgQ1VSU09SX1BBTEVUVEVfTUFTSyk7CglPVVRSRUcoQ1VSU09SX0FfUEFMRVRURTIsIGZnICYgQ1VSU09SX1BBTEVUVEVfTUFTSyk7CglPVVRSRUcoQ1VSU09SX0FfUEFMRVRURTMsIGJnICYgQ1VSU09SX1BBTEVUVEVfTUFTSyk7Cn0KCnZvaWQKaW50ZWxmYmh3X2N1cnNvcl9sb2FkKHN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCgkJICAgICAgdTggKmRhdGEpCnsKCXU4IF9faW9tZW0gKmFkZHIgPSAodTggX19pb21lbSAqKWRpbmZvLT5jdXJzb3IudmlydHVhbDsKCWludCBpLCBqLCB3ID0gd2lkdGggLyA4OwoJaW50IG1vZCA9IHdpZHRoICUgOCwgdF9tYXNrLCBkX21hc2s7CgojaWYgVkVSQk9TRSA+IDAKCURCR19NU0coImludGVsZmJod19jdXJzb3JfbG9hZFxuIik7CiNlbmRpZgoKCWlmICghZGluZm8tPmN1cnNvci52aXJ0dWFsKQoJCXJldHVybjsKCgl0X21hc2sgPSAweGZmID4+IG1vZDsKCWRfbWFzayA9IH4oMHhmZiA+PiBtb2QpOwoJZm9yIChpID0gaGVpZ2h0OyBpLS07ICkgewoJCWZvciAoaiA9IDA7IGogPCB3OyBqKyspIHsKCQkJd3JpdGViKDB4MDAsIGFkZHIgKyBqKTsKCQkJd3JpdGViKCooZGF0YSsrKSwgYWRkciArIGorOCk7CgkJfQoJCWlmIChtb2QpIHsKCQkJd3JpdGViKHRfbWFzaywgYWRkciArIGopOwoJCQl3cml0ZWIoKihkYXRhKyspICYgZF9tYXNrLCBhZGRyICsgais4KTsKCQl9CgkJYWRkciArPSAxNjsKCX0KfQoKdm9pZAppbnRlbGZiaHdfY3Vyc29yX3Jlc2V0KHN0cnVjdCBpbnRlbGZiX2luZm8gKmRpbmZvKSB7Cgl1OCBfX2lvbWVtICphZGRyID0gKHU4IF9faW9tZW0gKilkaW5mby0+Y3Vyc29yLnZpcnR1YWw7CglpbnQgaSwgajsKCiNpZiBWRVJCT1NFID4gMAoJREJHX01TRygiaW50ZWxmYmh3X2N1cnNvcl9yZXNldFxuIik7CiNlbmRpZgoKCWlmICghZGluZm8tPmN1cnNvci52aXJ0dWFsKQoJCXJldHVybjsKCglmb3IgKGkgPSA2NDsgaS0tOyApIHsKCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CgkJCXdyaXRlYigweGZmLCBhZGRyICsgaiswKTsKCQkJd3JpdGViKDB4MDAsIGFkZHIgKyBqKzgpOwoJCX0KCQlhZGRyICs9IDE2OwoJfQp9Cg==