LyoKICogU2NhdHRlcmxpc3QgQ3J5cHRvZ3JhcGhpYyBBUEkuCiAqCiAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KICogQ29weXJpZ2h0IChjKSAyMDAyIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKICogQ29weXJpZ2h0IChjKSAyMDA1IEhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4KICoKICogUG9ydGlvbnMgZGVyaXZlZCBmcm9tIENyeXB0b2FwaSwgYnkgQWxleGFuZGVyIEtqZWxkYWFzIDxhc3RvckBmYXN0Lm5vPgogKiBhbmQgTmV0dGxlLCBieSBOaWVscyBN9mxsZXIuCiAqIAogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQogKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICovCiNpZm5kZWYgX0xJTlVYX0NSWVBUT19ICiNkZWZpbmUgX0xJTlVYX0NSWVBUT19ICgojaW5jbHVkZSA8YXNtL2F0b21pYy5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgojaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgoKLyoKICogQWxnb3JpdGhtIG1hc2tzIGFuZCB0eXBlcy4KICovCiNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX01BU0sJCTB4MDAwMDAwMGYKI2RlZmluZSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSCQkweDAwMDAwMDAxCiNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0RJR0VTVAkJMHgwMDAwMDAwMgojZGVmaW5lIENSWVBUT19BTEdfVFlQRV9IQVNICQkweDAwMDAwMDAzCiNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUgkweDAwMDAwMDA0CiNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTCTB4MDAwMDAwMDUKCiNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0hBU0hfTUFTSwkweDAwMDAwMDBlCgojZGVmaW5lIENSWVBUT19BTEdfTEFSVkFMCQkweDAwMDAwMDEwCiNkZWZpbmUgQ1JZUFRPX0FMR19ERUFECQkJMHgwMDAwMDAyMAojZGVmaW5lIENSWVBUT19BTEdfRFlJTkcJCTB4MDAwMDAwNDAKI2RlZmluZSBDUllQVE9fQUxHX0FTWU5DCQkweDAwMDAwMDgwCgovKgogKiBTZXQgdGhpcyBiaXQgaWYgYW5kIG9ubHkgaWYgdGhlIGFsZ29yaXRobSByZXF1aXJlcyBhbm90aGVyIGFsZ29yaXRobSBvZgogKiB0aGUgc2FtZSB0eXBlIHRvIGhhbmRsZSBjb3JuZXIgY2FzZXMuCiAqLwojZGVmaW5lIENSWVBUT19BTEdfTkVFRF9GQUxMQkFDSwkweDAwMDAwMTAwCgovKgogKiBUcmFuc2Zvcm0gbWFza3MgYW5kIHZhbHVlcyAoZm9yIGNydF9mbGFncykuCiAqLwojZGVmaW5lIENSWVBUT19URk1fTU9ERV9NQVNLCQkweDAwMDAwMGZmCiNkZWZpbmUgQ1JZUFRPX1RGTV9SRVFfTUFTSwkJMHgwMDBmZmYwMAojZGVmaW5lIENSWVBUT19URk1fUkVTX01BU0sJCTB4ZmZmMDAwMDAKCiNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX0VDQgkJMHgwMDAwMDAwMQojZGVmaW5lIENSWVBUT19URk1fTU9ERV9DQkMJCTB4MDAwMDAwMDIKI2RlZmluZSBDUllQVE9fVEZNX01PREVfQ0ZCCQkweDAwMDAwMDA0CiNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX0NUUgkJMHgwMDAwMDAwOAoKI2RlZmluZSBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWQkJMHgwMDAwMDEwMAojZGVmaW5lIENSWVBUT19URk1fUkVRX01BWV9TTEVFUAkweDAwMDAwMjAwCiNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfV0VBS19LRVkJCTB4MDAxMDAwMDAKI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfS0VZX0xFTiAgIAkweDAwMjAwMDAwCiNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9TQ0hFRCAJMHgwMDQwMDAwMAojZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9CTE9DS19MRU4gCTB4MDA4MDAwMDAKI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfRkxBR1MgCTB4MDEwMDAwMDAKCi8qCiAqIE1pc2NlbGxhbmVvdXMgc3R1ZmYuCiAqLwojZGVmaW5lIENSWVBUT19VTlNQRUMJCQkwCiNkZWZpbmUgQ1JZUFRPX01BWF9BTEdfTkFNRQkJNjQKCiNkZWZpbmUgQ1JZUFRPX0RJUl9FTkNSWVBUCQkxCiNkZWZpbmUgQ1JZUFRPX0RJUl9ERUNSWVBUCQkwCgovKgogKiBUaGUgbWFjcm8gQ1JZUFRPX01JTkFMSUdOX0FUVFIgKGFsb25nIHdpdGggdGhlIHZvaWQgKiB0eXBlIGluIHRoZSBhY3R1YWwKICogZGVjbGFyYXRpb24pIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGNyeXB0b190Zm0gY29udGV4dCBzdHJ1Y3R1cmUgaXMKICogYWxpZ25lZCBjb3JyZWN0bHkgZm9yIHRoZSBnaXZlbiBhcmNoaXRlY3R1cmUgc28gdGhhdCB0aGVyZSBhcmUgbm8gYWxpZ25tZW50CiAqIGZhdWx0cyBmb3IgQyBkYXRhIHR5cGVzLiAgSW4gcGFydGljdWxhciwgdGhpcyBpcyByZXF1aXJlZCBvbiBwbGF0Zm9ybXMgc3VjaAogKiBhcyBhcm0gd2hlcmUgcG9pbnRlcnMgYXJlIDMyLWJpdCBhbGlnbmVkIGJ1dCB0aGVyZSBhcmUgZGF0YSB0eXBlcyBzdWNoIGFzCiAqIHU2NCB3aGljaCByZXF1aXJlIDY0LWJpdCBhbGlnbm1lbnQuCiAqLwojaWYgZGVmaW5lZChBUkNIX0tNQUxMT0NfTUlOQUxJR04pCiNkZWZpbmUgQ1JZUFRPX01JTkFMSUdOIEFSQ0hfS01BTExPQ19NSU5BTElHTgojZWxpZiBkZWZpbmVkKEFSQ0hfU0xBQl9NSU5BTElHTikKI2RlZmluZSBDUllQVE9fTUlOQUxJR04gQVJDSF9TTEFCX01JTkFMSUdOCiNlbmRpZgoKI2lmZGVmIENSWVBUT19NSU5BTElHTgojZGVmaW5lIENSWVBUT19NSU5BTElHTl9BVFRSIF9fYXR0cmlidXRlX18gKChfX2FsaWduZWRfXyhDUllQVE9fTUlOQUxJR04pKSkKI2Vsc2UKI2RlZmluZSBDUllQVE9fTUlOQUxJR05fQVRUUgojZW5kaWYKCnN0cnVjdCBzY2F0dGVybGlzdDsKc3RydWN0IGNyeXB0b19ibGtjaXBoZXI7CnN0cnVjdCBjcnlwdG9faGFzaDsKc3RydWN0IGNyeXB0b190Zm07CnN0cnVjdCBjcnlwdG9fdHlwZTsKCnN0cnVjdCBibGtjaXBoZXJfZGVzYyB7CglzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtOwoJdm9pZCAqaW5mbzsKCXUzMiBmbGFnczsKfTsKCnN0cnVjdCBjaXBoZXJfZGVzYyB7CglzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtOwoJdm9pZCAoKmNyZm4pKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOwoJdW5zaWduZWQgaW50ICgqcHJmbikoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLCB1OCAqZHN0LAoJCQkgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpOwoJdm9pZCAqaW5mbzsKfTsKCnN0cnVjdCBoYXNoX2Rlc2MgewoJc3RydWN0IGNyeXB0b19oYXNoICp0Zm07Cgl1MzIgZmxhZ3M7Cn07CgovKgogKiBBbGdvcml0aG1zOiBtb2R1bGFyIGNyeXB0byBhbGdvcml0aG0gaW1wbGVtZW50YXRpb25zLCBtYW5hZ2VkCiAqIHZpYSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCkgYW5kIGNyeXB0b191bnJlZ2lzdGVyX2FsZygpLgogKi8Kc3RydWN0IGJsa2NpcGhlcl9hbGcgewoJaW50ICgqc2V0a2V5KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqa2V5LAoJICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuKTsKCWludCAoKmVuY3J5cHQpKHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAoJCSAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKCWludCAoKmRlY3J5cHQpKHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAoJCSAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKCgl1bnNpZ25lZCBpbnQgbWluX2tleXNpemU7Cgl1bnNpZ25lZCBpbnQgbWF4X2tleXNpemU7Cgl1bnNpZ25lZCBpbnQgaXZzaXplOwp9OwoKc3RydWN0IGNpcGhlcl9hbGcgewoJdW5zaWduZWQgaW50IGNpYV9taW5fa2V5c2l6ZTsKCXVuc2lnbmVkIGludCBjaWFfbWF4X2tleXNpemU7CglpbnQgKCpjaWFfc2V0a2V5KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqa2V5LAoJICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleWxlbik7Cgl2b2lkICgqY2lhX2VuY3J5cHQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOwoJdm9pZCAoKmNpYV9kZWNyeXB0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKCgl1bnNpZ25lZCBpbnQgKCpjaWFfZW5jcnlwdF9lY2IpKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKCQkJCQl1OCAqZHN0LCBjb25zdCB1OCAqc3JjLAoJCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpIF9fZGVwcmVjYXRlZDsKCXVuc2lnbmVkIGludCAoKmNpYV9kZWNyeXB0X2VjYikoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAoJCQkJCXU4ICpkc3QsIGNvbnN0IHU4ICpzcmMsCgkJCQkJdW5zaWduZWQgaW50IG5ieXRlcykgX19kZXByZWNhdGVkOwoJdW5zaWduZWQgaW50ICgqY2lhX2VuY3J5cHRfY2JjKShjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCgkJCQkJdTggKmRzdCwgY29uc3QgdTggKnNyYywKCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKSBfX2RlcHJlY2F0ZWQ7Cgl1bnNpZ25lZCBpbnQgKCpjaWFfZGVjcnlwdF9jYmMpKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKCQkJCQl1OCAqZHN0LCBjb25zdCB1OCAqc3JjLAoJCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpIF9fZGVwcmVjYXRlZDsKfTsKCnN0cnVjdCBkaWdlc3RfYWxnIHsKCXVuc2lnbmVkIGludCBkaWFfZGlnZXN0c2l6ZTsKCXZvaWQgKCpkaWFfaW5pdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Cgl2b2lkICgqZGlhX3VwZGF0ZSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmRhdGEsCgkJCSAgIHVuc2lnbmVkIGludCBsZW4pOwoJdm9pZCAoKmRpYV9maW5hbCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCk7CglpbnQgKCpkaWFfc2V0a2V5KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqa2V5LAoJICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleWxlbik7Cn07CgpzdHJ1Y3QgaGFzaF9hbGcgewoJaW50ICgqaW5pdCkoc3RydWN0IGhhc2hfZGVzYyAqZGVzYyk7CglpbnQgKCp1cGRhdGUpKHN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCgkJICAgICAgdW5zaWduZWQgaW50IG5ieXRlcyk7CglpbnQgKCpmaW5hbCkoc3RydWN0IGhhc2hfZGVzYyAqZGVzYywgdTggKm91dCk7CglpbnQgKCpkaWdlc3QpKHN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCgkJICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKm91dCk7CglpbnQgKCpzZXRrZXkpKHN0cnVjdCBjcnlwdG9faGFzaCAqdGZtLCBjb25zdCB1OCAqa2V5LAoJCSAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4pOwoKCXVuc2lnbmVkIGludCBkaWdlc3RzaXplOwp9OwoKc3RydWN0IGNvbXByZXNzX2FsZyB7CglpbnQgKCpjb2FfY29tcHJlc3MpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICpzcmMsCgkJCSAgICB1bnNpZ25lZCBpbnQgc2xlbiwgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKCWludCAoKmNvYV9kZWNvbXByZXNzKShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqc3JjLAoJCQkgICAgICB1bnNpZ25lZCBpbnQgc2xlbiwgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKfTsKCiNkZWZpbmUgY3JhX2Jsa2NpcGhlcgljcmFfdS5ibGtjaXBoZXIKI2RlZmluZSBjcmFfY2lwaGVyCWNyYV91LmNpcGhlcgojZGVmaW5lIGNyYV9kaWdlc3QJY3JhX3UuZGlnZXN0CiNkZWZpbmUgY3JhX2hhc2gJY3JhX3UuaGFzaAojZGVmaW5lIGNyYV9jb21wcmVzcwljcmFfdS5jb21wcmVzcwoKc3RydWN0IGNyeXB0b19hbGcgewoJc3RydWN0IGxpc3RfaGVhZCBjcmFfbGlzdDsKCXN0cnVjdCBsaXN0X2hlYWQgY3JhX3VzZXJzOwoKCXUzMiBjcmFfZmxhZ3M7Cgl1bnNpZ25lZCBpbnQgY3JhX2Jsb2Nrc2l6ZTsKCXVuc2lnbmVkIGludCBjcmFfY3R4c2l6ZTsKCXVuc2lnbmVkIGludCBjcmFfYWxpZ25tYXNrOwoKCWludCBjcmFfcHJpb3JpdHk7CglhdG9taWNfdCBjcmFfcmVmY250OwoKCWNoYXIgY3JhX25hbWVbQ1JZUFRPX01BWF9BTEdfTkFNRV07CgljaGFyIGNyYV9kcml2ZXJfbmFtZVtDUllQVE9fTUFYX0FMR19OQU1FXTsKCgljb25zdCBzdHJ1Y3QgY3J5cHRvX3R5cGUgKmNyYV90eXBlOwoKCXVuaW9uIHsKCQlzdHJ1Y3QgYmxrY2lwaGVyX2FsZyBibGtjaXBoZXI7CgkJc3RydWN0IGNpcGhlcl9hbGcgY2lwaGVyOwoJCXN0cnVjdCBkaWdlc3RfYWxnIGRpZ2VzdDsKCQlzdHJ1Y3QgaGFzaF9hbGcgaGFzaDsKCQlzdHJ1Y3QgY29tcHJlc3NfYWxnIGNvbXByZXNzOwoJfSBjcmFfdTsKCglpbnQgKCpjcmFfaW5pdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Cgl2b2lkICgqY3JhX2V4aXQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwoJdm9pZCAoKmNyYV9kZXN0cm95KShzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKTsKCQoJc3RydWN0IG1vZHVsZSAqY3JhX21vZHVsZTsKfTsKCi8qCiAqIEFsZ29yaXRobSByZWdpc3RyYXRpb24gaW50ZXJmYWNlLgogKi8KaW50IGNyeXB0b19yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZyk7CmludCBjcnlwdG9fdW5yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZyk7CgovKgogKiBBbGdvcml0aG0gcXVlcnkgaW50ZXJmYWNlLgogKi8KI2lmZGVmIENPTkZJR19DUllQVE8KaW50IGNyeXB0b19oYXNfYWxnKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiB0eXBlLCB1MzIgbWFzayk7CiNlbHNlCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19hbGdfYXZhaWxhYmxlKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBmbGFncykKewoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19oYXNfYWxnKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiB0eXBlLCB1MzIgbWFzaykKewoJcmV0dXJuIDA7Cn0KI2VuZGlmCgovKgogKiBUcmFuc2Zvcm1zOiB1c2VyLWluc3RhbnRpYXRlZCBvYmplY3RzIHdoaWNoIGVuY2Fwc3VsYXRlIGFsZ29yaXRobXMKICogYW5kIGNvcmUgcHJvY2Vzc2luZyBsb2dpYy4gIE1hbmFnZWQgdmlhIGNyeXB0b19hbGxvY18qKCkgYW5kCiAqIGNyeXB0b19mcmVlXyooKSwgYXMgd2VsbCBhcyB0aGUgdmFyaW91cyBoZWxwZXJzIGJlbG93LgogKi8KCnN0cnVjdCBibGtjaXBoZXJfdGZtIHsKCXZvaWQgKml2OwoJaW50ICgqc2V0a2V5KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqa2V5LAoJCSAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4pOwoJaW50ICgqZW5jcnlwdCkoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpOwoJaW50ICgqZGVjcnlwdCkoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpOwp9OwoKc3RydWN0IGNpcGhlcl90Zm0gewoJdm9pZCAqY2l0X2l2OwoJdW5zaWduZWQgaW50IGNpdF9pdnNpemU7Cgl1MzIgY2l0X21vZGU7CglpbnQgKCpjaXRfc2V0a2V5KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAoJICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbik7CglpbnQgKCpjaXRfZW5jcnlwdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCgkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAoJCQkgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKCWludCAoKmNpdF9lbmNyeXB0X2l2KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAoJICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAoJICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAoJICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdik7CglpbnQgKCpjaXRfZGVjcnlwdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCgkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAoJCQkgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKCWludCAoKmNpdF9kZWNyeXB0X2l2KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAoJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCgkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdik7Cgl2b2lkICgqY2l0X3hvcl9ibG9jaykodTggKmRzdCwgY29uc3QgdTggKnNyYyk7Cgl2b2lkICgqY2l0X2VuY3J5cHRfb25lKShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKCXZvaWQgKCpjaXRfZGVjcnlwdF9vbmUpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOwp9OwoKc3RydWN0IGhhc2hfdGZtIHsKCWludCAoKmluaXQpKHN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MpOwoJaW50ICgqdXBkYXRlKShzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjLAoJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuc2cpOwoJaW50ICgqZmluYWwpKHN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MsIHU4ICpvdXQpOwoJaW50ICgqZGlnZXN0KShzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAoJCSAgICAgIHVuc2lnbmVkIGludCBuc2csIHU4ICpvdXQpOwoJaW50ICgqc2V0a2V5KShzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbSwgY29uc3QgdTggKmtleSwKCQkgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuKTsKCXVuc2lnbmVkIGludCBkaWdlc3RzaXplOwp9OwoKc3RydWN0IGNvbXByZXNzX3RmbSB7CglpbnQgKCpjb3RfY29tcHJlc3MpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCgkgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAoJICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pOwoJaW50ICgqY290X2RlY29tcHJlc3MpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCgkgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCgkgICAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKfTsKCiNkZWZpbmUgY3J0X2Jsa2NpcGhlcgljcnRfdS5ibGtjaXBoZXIKI2RlZmluZSBjcnRfY2lwaGVyCWNydF91LmNpcGhlcgojZGVmaW5lIGNydF9oYXNoCWNydF91Lmhhc2gKI2RlZmluZSBjcnRfY29tcHJlc3MJY3J0X3UuY29tcHJlc3MKCnN0cnVjdCBjcnlwdG9fdGZtIHsKCgl1MzIgY3J0X2ZsYWdzOwoJCgl1bmlvbiB7CgkJc3RydWN0IGJsa2NpcGhlcl90Zm0gYmxrY2lwaGVyOwoJCXN0cnVjdCBjaXBoZXJfdGZtIGNpcGhlcjsKCQlzdHJ1Y3QgaGFzaF90Zm0gaGFzaDsKCQlzdHJ1Y3QgY29tcHJlc3NfdGZtIGNvbXByZXNzOwoJfSBjcnRfdTsKCQoJc3RydWN0IGNyeXB0b19hbGcgKl9fY3J0X2FsZzsKCgl2b2lkICpfX2NydF9jdHhbXSBDUllQVE9fTUlOQUxJR05fQVRUUjsKfTsKCiNkZWZpbmUgY3J5cHRvX2NpcGhlciBjcnlwdG9fdGZtCiNkZWZpbmUgY3J5cHRvX2NvbXAgY3J5cHRvX3RmbQoKc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgewoJc3RydWN0IGNyeXB0b190Zm0gYmFzZTsKfTsKCnN0cnVjdCBjcnlwdG9faGFzaCB7CglzdHJ1Y3QgY3J5cHRvX3RmbSBiYXNlOwp9OwoKZW51bSB7CglDUllQVE9BX1VOU1BFQywKCUNSWVBUT0FfQUxHLAp9OwoKc3RydWN0IGNyeXB0b19hdHRyX2FsZyB7CgljaGFyIG5hbWVbQ1JZUFRPX01BWF9BTEdfTkFNRV07Cn07CgovKiAKICogVHJhbnNmb3JtIHVzZXIgaW50ZXJmYWNlLgogKi8KIApzdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX2FsbG9jX3RmbShjb25zdCBjaGFyICphbGdfbmFtZSwgdTMyIHRmbV9mbGFncyk7CnN0cnVjdCBjcnlwdG9fdGZtICpjcnlwdG9fYWxsb2NfYmFzZShjb25zdCBjaGFyICphbGdfbmFtZSwgdTMyIHR5cGUsIHUzMiBtYXNrKTsKdm9pZCBjcnlwdG9fZnJlZV90Zm0oc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CgovKgogKiBUcmFuc2Zvcm0gaGVscGVycyB3aGljaCBxdWVyeSB0aGUgdW5kZXJseWluZyBhbGdvcml0aG0uCiAqLwpzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmNyeXB0b190Zm1fYWxnX25hbWUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKewoJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfbmFtZTsKfQoKc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpjcnlwdG9fdGZtX2FsZ19kcml2ZXJfbmFtZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQp7CglyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9kcml2ZXJfbmFtZTsKfQoKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX3RmbV9hbGdfcHJpb3JpdHkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKewoJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfcHJpb3JpdHk7Cn0KCnN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqY3J5cHRvX3RmbV9hbGdfbW9kbmFtZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQp7CglyZXR1cm4gbW9kdWxlX25hbWUodGZtLT5fX2NydF9hbGctPmNyYV9tb2R1bGUpOwp9CgpzdGF0aWMgaW5saW5lIHUzMiBjcnlwdG9fdGZtX2FsZ190eXBlKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2ZsYWdzICYgQ1JZUFRPX0FMR19UWVBFX01BU0s7Cn0KCnN0YXRpYyB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfbWluX2tleXNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKCV9fZGVwcmVjYXRlZDsKc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfbWluX2tleXNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKewoJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfbWluX2tleXNpemU7Cn0KCnN0YXRpYyB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfbWF4X2tleXNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKCV9fZGVwcmVjYXRlZDsKc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfbWF4X2tleXNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKewoJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfbWF4X2tleXNpemU7Cn0KCnN0YXRpYyB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfaXZzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pIF9fZGVwcmVjYXRlZDsKc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfaXZzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CglyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9pdnNpemU7Cn0KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQp7CglyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9ibG9ja3NpemU7Cn0KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2RpZ2VzdHNpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKewoJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2RpZ2VzdC5kaWFfZGlnZXN0c2l6ZTsKfQoKc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9hbGdfYWxpZ25tYXNrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2FsaWdubWFzazsKfQoKc3RhdGljIGlubGluZSB1MzIgY3J5cHRvX3RmbV9nZXRfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKewoJcmV0dXJuIHRmbS0+Y3J0X2ZsYWdzOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX3RmbV9zZXRfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKQp7Cgl0Zm0tPmNydF9mbGFncyB8PSBmbGFnczsKfQoKc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b190Zm1fY2xlYXJfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKQp7Cgl0Zm0tPmNydF9mbGFncyAmPSB+ZmxhZ3M7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCAqY3J5cHRvX3RmbV9jdHgoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKewoJcmV0dXJuIHRmbS0+X19jcnRfY3R4Owp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2N0eF9hbGlnbm1lbnQodm9pZCkKewoJc3RydWN0IGNyeXB0b190Zm0gKnRmbTsKCXJldHVybiBfX2FsaWdub2ZfXyh0Zm0tPl9fY3J0X2N0eCk7Cn0KCi8qCiAqIEFQSSB3cmFwcGVycy4KICovCnN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKl9fY3J5cHRvX2Jsa2NpcGhlcl9jYXN0KAoJc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKewoJcmV0dXJuIChzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqKXRmbTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqY3J5cHRvX2Jsa2NpcGhlcl9jYXN0KAoJc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKewoJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSKTsKCXJldHVybiBfX2NyeXB0b19ibGtjaXBoZXJfY2FzdCh0Zm0pOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICpjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKAoJY29uc3QgY2hhciAqYWxnX25hbWUsIHUzMiB0eXBlLCB1MzIgbWFzaykKewoJdHlwZSAmPSB+Q1JZUFRPX0FMR19UWVBFX01BU0s7Cgl0eXBlIHw9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVI7CgltYXNrIHw9IENSWVBUT19BTEdfVFlQRV9NQVNLOwoKCXJldHVybiBfX2NyeXB0b19ibGtjaXBoZXJfY2FzdChjcnlwdG9fYWxsb2NfYmFzZShhbGdfbmFtZSwgdHlwZSwgbWFzaykpOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fdGZtICpjcnlwdG9fYmxrY2lwaGVyX3RmbSgKCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0pCnsKCXJldHVybiAmdGZtLT5iYXNlOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0pCnsKCWNyeXB0b19mcmVlX3RmbShjcnlwdG9fYmxrY2lwaGVyX3RmbSh0Zm0pKTsKfQoKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2hhc19ibGtjaXBoZXIoY29uc3QgY2hhciAqYWxnX25hbWUsIHUzMiB0eXBlLCB1MzIgbWFzaykKewoJdHlwZSAmPSB+Q1JZUFRPX0FMR19UWVBFX01BU0s7Cgl0eXBlIHw9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVI7CgltYXNrIHw9IENSWVBUT19BTEdfVFlQRV9NQVNLOwoKCXJldHVybiBjcnlwdG9faGFzX2FsZyhhbGdfbmFtZSwgdHlwZSwgbWFzayk7Cn0KCnN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqY3J5cHRvX2Jsa2NpcGhlcl9uYW1lKHN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0pCnsKCXJldHVybiBjcnlwdG9fdGZtX2FsZ19uYW1lKGNyeXB0b19ibGtjaXBoZXJfdGZtKHRmbSkpOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBibGtjaXBoZXJfdGZtICpjcnlwdG9fYmxrY2lwaGVyX2NydCgKCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0pCnsKCXJldHVybiAmY3J5cHRvX2Jsa2NpcGhlcl90Zm0odGZtKS0+Y3J0X2Jsa2NpcGhlcjsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgYmxrY2lwaGVyX2FsZyAqY3J5cHRvX2Jsa2NpcGhlcl9hbGcoCglzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtKQp7CglyZXR1cm4gJmNyeXB0b19ibGtjaXBoZXJfdGZtKHRmbSktPl9fY3J0X2FsZy0+Y3JhX2Jsa2NpcGhlcjsKfQoKc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX2Jsa2NpcGhlcl9pdnNpemUoc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbSkKewoJcmV0dXJuIGNyeXB0b19ibGtjaXBoZXJfYWxnKHRmbSktPml2c2l6ZTsKfQoKc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX2Jsa2NpcGhlcl9ibG9ja3NpemUoCglzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtKQp7CglyZXR1cm4gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKGNyeXB0b19ibGtjaXBoZXJfdGZtKHRmbSkpOwp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fYmxrY2lwaGVyX2FsaWdubWFzaygKCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0pCnsKCXJldHVybiBjcnlwdG9fdGZtX2FsZ19hbGlnbm1hc2soY3J5cHRvX2Jsa2NpcGhlcl90Zm0odGZtKSk7Cn0KCnN0YXRpYyBpbmxpbmUgdTMyIGNyeXB0b19ibGtjaXBoZXJfZ2V0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0pCnsKCXJldHVybiBjcnlwdG9fdGZtX2dldF9mbGFncyhjcnlwdG9fYmxrY2lwaGVyX3RmbSh0Zm0pKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19ibGtjaXBoZXJfc2V0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0sCgkJCQkJICAgICAgdTMyIGZsYWdzKQp7CgljcnlwdG9fdGZtX3NldF9mbGFncyhjcnlwdG9fYmxrY2lwaGVyX3RmbSh0Zm0pLCBmbGFncyk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fYmxrY2lwaGVyX2NsZWFyX2ZsYWdzKHN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0sCgkJCQkJCXUzMiBmbGFncykKewoJY3J5cHRvX3RmbV9jbGVhcl9mbGFncyhjcnlwdG9fYmxrY2lwaGVyX3RmbSh0Zm0pLCBmbGFncyk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KHN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0sCgkJCQkJICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQp7CglyZXR1cm4gY3J5cHRvX2Jsa2NpcGhlcl9jcnQodGZtKS0+c2V0a2V5KGNyeXB0b19ibGtjaXBoZXJfdGZtKHRmbSksCgkJCQkJCSBrZXksIGtleWxlbik7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCgkJCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCgkJCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCgkJCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcykKewoJZGVzYy0+aW5mbyA9IGNyeXB0b19ibGtjaXBoZXJfY3J0KGRlc2MtPnRmbSktPml2OwoJcmV0dXJuIGNyeXB0b19ibGtjaXBoZXJfY3J0KGRlc2MtPnRmbSktPmVuY3J5cHQoZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdF9pdihzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCgkJCQkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCgkJCQkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCgkJCQkJICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKewoJcmV0dXJuIGNyeXB0b19ibGtjaXBoZXJfY3J0KGRlc2MtPnRmbSktPmVuY3J5cHQoZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19ibGtjaXBoZXJfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCgkJCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCgkJCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCgkJCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcykKewoJZGVzYy0+aW5mbyA9IGNyeXB0b19ibGtjaXBoZXJfY3J0KGRlc2MtPnRmbSktPml2OwoJcmV0dXJuIGNyeXB0b19ibGtjaXBoZXJfY3J0KGRlc2MtPnRmbSktPmRlY3J5cHQoZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19ibGtjaXBoZXJfZGVjcnlwdF9pdihzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCgkJCQkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCgkJCQkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCgkJCQkJICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKewoJcmV0dXJuIGNyeXB0b19ibGtjaXBoZXJfY3J0KGRlc2MtPnRmbSktPmRlY3J5cHQoZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fYmxrY2lwaGVyX3NldF9pdihzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtLAoJCQkJCSAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBsZW4pCnsKCW1lbWNweShjcnlwdG9fYmxrY2lwaGVyX2NydCh0Zm0pLT5pdiwgc3JjLCBsZW4pOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2Jsa2NpcGhlcl9nZXRfaXYoc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbSwKCQkJCQkgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgbGVuKQp7CgltZW1jcHkoZHN0LCBjcnlwdG9fYmxrY2lwaGVyX2NydCh0Zm0pLT5pdiwgbGVuKTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqX19jcnlwdG9fY2lwaGVyX2Nhc3Qoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKewoJcmV0dXJuIChzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqKXRmbTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqY3J5cHRvX2NpcGhlcl9jYXN0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CglyZXR1cm4gX19jcnlwdG9fY2lwaGVyX2Nhc3QodGZtKTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqY3J5cHRvX2FsbG9jX2NpcGhlcihjb25zdCBjaGFyICphbGdfbmFtZSwKCQkJCQkJCXUzMiB0eXBlLCB1MzIgbWFzaykKewoJdHlwZSAmPSB+Q1JZUFRPX0FMR19UWVBFX01BU0s7Cgl0eXBlIHw9IENSWVBUT19BTEdfVFlQRV9DSVBIRVI7CgltYXNrIHw9IENSWVBUT19BTEdfVFlQRV9NQVNLOwoKCXJldHVybiBfX2NyeXB0b19jaXBoZXJfY2FzdChjcnlwdG9fYWxsb2NfYmFzZShhbGdfbmFtZSwgdHlwZSwgbWFzaykpOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fdGZtICpjcnlwdG9fY2lwaGVyX3RmbShzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtKQp7CglyZXR1cm4gdGZtOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2ZyZWVfY2lwaGVyKHN0cnVjdCBjcnlwdG9fY2lwaGVyICp0Zm0pCnsKCWNyeXB0b19mcmVlX3RmbShjcnlwdG9fY2lwaGVyX3RmbSh0Zm0pKTsKfQoKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2hhc19jaXBoZXIoY29uc3QgY2hhciAqYWxnX25hbWUsIHUzMiB0eXBlLCB1MzIgbWFzaykKewoJdHlwZSAmPSB+Q1JZUFRPX0FMR19UWVBFX01BU0s7Cgl0eXBlIHw9IENSWVBUT19BTEdfVFlQRV9DSVBIRVI7CgltYXNrIHw9IENSWVBUT19BTEdfVFlQRV9NQVNLOwoKCXJldHVybiBjcnlwdG9faGFzX2FsZyhhbGdfbmFtZSwgdHlwZSwgbWFzayk7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGNpcGhlcl90Zm0gKmNyeXB0b19jaXBoZXJfY3J0KHN0cnVjdCBjcnlwdG9fY2lwaGVyICp0Zm0pCnsKCXJldHVybiAmY3J5cHRvX2NpcGhlcl90Zm0odGZtKS0+Y3J0X2NpcGhlcjsKfQoKc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX2NpcGhlcl9ibG9ja3NpemUoc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSkKewoJcmV0dXJuIGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZShjcnlwdG9fY2lwaGVyX3RmbSh0Zm0pKTsKfQoKc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX2NpcGhlcl9hbGlnbm1hc2soc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSkKewoJcmV0dXJuIGNyeXB0b190Zm1fYWxnX2FsaWdubWFzayhjcnlwdG9fY2lwaGVyX3RmbSh0Zm0pKTsKfQoKc3RhdGljIGlubGluZSB1MzIgY3J5cHRvX2NpcGhlcl9nZXRfZmxhZ3Moc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSkKewoJcmV0dXJuIGNyeXB0b190Zm1fZ2V0X2ZsYWdzKGNyeXB0b19jaXBoZXJfdGZtKHRmbSkpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2NpcGhlcl9zZXRfZmxhZ3Moc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSwKCQkJCQkgICB1MzIgZmxhZ3MpCnsKCWNyeXB0b190Zm1fc2V0X2ZsYWdzKGNyeXB0b19jaXBoZXJfdGZtKHRmbSksIGZsYWdzKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19jaXBoZXJfY2xlYXJfZmxhZ3Moc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSwKCQkJCQkgICAgIHUzMiBmbGFncykKewoJY3J5cHRvX3RmbV9jbGVhcl9mbGFncyhjcnlwdG9fY2lwaGVyX3RmbSh0Zm0pLCBmbGFncyk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfc2V0a2V5KHN0cnVjdCBjcnlwdG9fY2lwaGVyICp0Zm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCnsKCXJldHVybiBjcnlwdG9fY2lwaGVyX2NydCh0Zm0pLT5jaXRfc2V0a2V5KGNyeXB0b19jaXBoZXJfdGZtKHRmbSksCgkJCQkJCSAga2V5LCBrZXlsZW4pOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2NpcGhlcl9lbmNyeXB0X29uZShzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtLAoJCQkJCSAgICAgdTggKmRzdCwgY29uc3QgdTggKnNyYykKewoJY3J5cHRvX2NpcGhlcl9jcnQodGZtKS0+Y2l0X2VuY3J5cHRfb25lKGNyeXB0b19jaXBoZXJfdGZtKHRmbSksCgkJCQkJCWRzdCwgc3JjKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19jaXBoZXJfZGVjcnlwdF9vbmUoc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSwKCQkJCQkgICAgIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCnsKCWNyeXB0b19jaXBoZXJfY3J0KHRmbSktPmNpdF9kZWNyeXB0X29uZShjcnlwdG9fY2lwaGVyX3RmbSh0Zm0pLAoJCQkJCQlkc3QsIHNyYyk7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19oYXNoICpfX2NyeXB0b19oYXNoX2Nhc3Qoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKewoJcmV0dXJuIChzdHJ1Y3QgY3J5cHRvX2hhc2ggKil0Zm07Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19oYXNoICpjcnlwdG9faGFzaF9jYXN0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCUJVR19PTigoY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pIF4gQ1JZUFRPX0FMR19UWVBFX0hBU0gpICYKCSAgICAgICBDUllQVE9fQUxHX1RZUEVfSEFTSF9NQVNLKTsKCXJldHVybiBfX2NyeXB0b19oYXNoX2Nhc3QodGZtKTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2hhc2ggKmNyeXB0b19hbGxvY19oYXNoKGNvbnN0IGNoYXIgKmFsZ19uYW1lLAoJCQkJCQkgICAgdTMyIHR5cGUsIHUzMiBtYXNrKQp7Cgl0eXBlICY9IH5DUllQVE9fQUxHX1RZUEVfTUFTSzsKCXR5cGUgfD0gQ1JZUFRPX0FMR19UWVBFX0hBU0g7CgltYXNrIHw9IENSWVBUT19BTEdfVFlQRV9IQVNIX01BU0s7CgoJcmV0dXJuIF9fY3J5cHRvX2hhc2hfY2FzdChjcnlwdG9fYWxsb2NfYmFzZShhbGdfbmFtZSwgdHlwZSwgbWFzaykpOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fdGZtICpjcnlwdG9faGFzaF90Zm0oc3RydWN0IGNyeXB0b19oYXNoICp0Zm0pCnsKCXJldHVybiAmdGZtLT5iYXNlOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2ZyZWVfaGFzaChzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbSkKewoJY3J5cHRvX2ZyZWVfdGZtKGNyeXB0b19oYXNoX3RmbSh0Zm0pKTsKfQoKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2hhc19oYXNoKGNvbnN0IGNoYXIgKmFsZ19uYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spCnsKCXR5cGUgJj0gfkNSWVBUT19BTEdfVFlQRV9NQVNLOwoJdHlwZSB8PSBDUllQVE9fQUxHX1RZUEVfSEFTSDsKCW1hc2sgfD0gQ1JZUFRPX0FMR19UWVBFX0hBU0hfTUFTSzsKCglyZXR1cm4gY3J5cHRvX2hhc19hbGcoYWxnX25hbWUsIHR5cGUsIG1hc2spOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBoYXNoX3RmbSAqY3J5cHRvX2hhc2hfY3J0KHN0cnVjdCBjcnlwdG9faGFzaCAqdGZtKQp7CglyZXR1cm4gJmNyeXB0b19oYXNoX3RmbSh0Zm0pLT5jcnRfaGFzaDsKfQoKc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX2hhc2hfYmxvY2tzaXplKHN0cnVjdCBjcnlwdG9faGFzaCAqdGZtKQp7CglyZXR1cm4gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKGNyeXB0b19oYXNoX3RmbSh0Zm0pKTsKfQoKc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX2hhc2hfYWxpZ25tYXNrKHN0cnVjdCBjcnlwdG9faGFzaCAqdGZtKQp7CglyZXR1cm4gY3J5cHRvX3RmbV9hbGdfYWxpZ25tYXNrKGNyeXB0b19oYXNoX3RmbSh0Zm0pKTsKfQoKc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbSkKewoJcmV0dXJuIGNyeXB0b19oYXNoX2NydCh0Zm0pLT5kaWdlc3RzaXplOwp9CgpzdGF0aWMgaW5saW5lIHUzMiBjcnlwdG9faGFzaF9nZXRfZmxhZ3Moc3RydWN0IGNyeXB0b19oYXNoICp0Zm0pCnsKCXJldHVybiBjcnlwdG9fdGZtX2dldF9mbGFncyhjcnlwdG9faGFzaF90Zm0odGZtKSk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9faGFzaF9zZXRfZmxhZ3Moc3RydWN0IGNyeXB0b19oYXNoICp0Zm0sIHUzMiBmbGFncykKewoJY3J5cHRvX3RmbV9zZXRfZmxhZ3MoY3J5cHRvX2hhc2hfdGZtKHRmbSksIGZsYWdzKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19oYXNoX2NsZWFyX2ZsYWdzKHN0cnVjdCBjcnlwdG9faGFzaCAqdGZtLCB1MzIgZmxhZ3MpCnsKCWNyeXB0b190Zm1fY2xlYXJfZmxhZ3MoY3J5cHRvX2hhc2hfdGZtKHRmbSksIGZsYWdzKTsKfQoKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2hhc2hfaW5pdChzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjKQp7CglyZXR1cm4gY3J5cHRvX2hhc2hfY3J0KGRlc2MtPnRmbSktPmluaXQoZGVzYyk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19oYXNoX3VwZGF0ZShzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjLAoJCQkJICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAoJCQkJICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQp7CglyZXR1cm4gY3J5cHRvX2hhc2hfY3J0KGRlc2MtPnRmbSktPnVwZGF0ZShkZXNjLCBzZywgbmJ5dGVzKTsKfQoKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2hhc2hfZmluYWwoc3RydWN0IGhhc2hfZGVzYyAqZGVzYywgdTggKm91dCkKewoJcmV0dXJuIGNyeXB0b19oYXNoX2NydChkZXNjLT50Zm0pLT5maW5hbChkZXNjLCBvdXQpOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9faGFzaF9kaWdlc3Qoc3RydWN0IGhhc2hfZGVzYyAqZGVzYywKCQkJCSAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKCQkJCSAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKm91dCkKewoJcmV0dXJuIGNyeXB0b19oYXNoX2NydChkZXNjLT50Zm0pLT5kaWdlc3QoZGVzYywgc2csIG5ieXRlcywgb3V0KTsKfQoKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2hhc2hfc2V0a2V5KHN0cnVjdCBjcnlwdG9faGFzaCAqaGFzaCwKCQkJCSAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKewoJcmV0dXJuIGNyeXB0b19oYXNoX2NydChoYXNoKS0+c2V0a2V5KGhhc2gsIGtleSwga2V5bGVuKTsKfQoKc3RhdGljIGludCBjcnlwdG9fY2lwaGVyX2VuY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKCQkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKCQkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKCQkJCSB1bnNpZ25lZCBpbnQgbmJ5dGVzKSBfX2RlcHJlY2F0ZWQ7CnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCnsKCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CglyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9lbmNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcyk7Cn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgpzdGF0aWMgaW50IGNyeXB0b19jaXBoZXJfZW5jcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAoJCQkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAoJCQkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAoJCQkJICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikgX19kZXByZWNhdGVkOwpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2VuY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpCnsKCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CglyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9lbmNyeXB0X2l2KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywgaXYpOwp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKc3RhdGljIGludCBjcnlwdG9fY2lwaGVyX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKCQkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKCQkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKCQkJCSB1bnNpZ25lZCBpbnQgbmJ5dGVzKSBfX2RlcHJlY2F0ZWQ7CnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCnsKCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CglyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9kZWNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcyk7Cn0KCnN0YXRpYyBpbnQgY3J5cHRvX2NpcGhlcl9kZWNyeXB0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCgkJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCgkJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCgkJCQkgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KSBfX2RlcHJlY2F0ZWQ7CnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZGVjcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKewoJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2RlY3J5cHRfaXYodGZtLCBkc3QsIHNyYywgbmJ5dGVzLCBpdik7Cn0KCnN0YXRpYyB2b2lkIGNyeXB0b19jaXBoZXJfc2V0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCgkJCQkgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IGxlbikgX19kZXByZWNhdGVkOwpzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2NpcGhlcl9zZXRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBsZW4pCnsKCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CgltZW1jcHkodGZtLT5jcnRfY2lwaGVyLmNpdF9pdiwgc3JjLCBsZW4pOwp9CgpzdGF0aWMgdm9pZCBjcnlwdG9fY2lwaGVyX2dldF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAoJCQkJIHU4ICpkc3QsIHVuc2lnbmVkIGludCBsZW4pIF9fZGVwcmVjYXRlZDsKc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19jaXBoZXJfZ2V0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgbGVuKQp7CglCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwoJbWVtY3B5KGRzdCwgdGZtLT5jcnRfY2lwaGVyLmNpdF9pdiwgbGVuKTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2NvbXAgKl9fY3J5cHRvX2NvbXBfY2FzdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQp7CglyZXR1cm4gKHN0cnVjdCBjcnlwdG9fY29tcCAqKXRmbTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2NvbXAgKmNyeXB0b19jb21wX2Nhc3Qoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKewoJQlVHX09OKChjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgXiBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1MpICYKCSAgICAgICBDUllQVE9fQUxHX1RZUEVfTUFTSyk7CglyZXR1cm4gX19jcnlwdG9fY29tcF9jYXN0KHRmbSk7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19jb21wICpjcnlwdG9fYWxsb2NfY29tcChjb25zdCBjaGFyICphbGdfbmFtZSwKCQkJCQkJICAgIHUzMiB0eXBlLCB1MzIgbWFzaykKewoJdHlwZSAmPSB+Q1JZUFRPX0FMR19UWVBFX01BU0s7Cgl0eXBlIHw9IENSWVBUT19BTEdfVFlQRV9DT01QUkVTUzsKCW1hc2sgfD0gQ1JZUFRPX0FMR19UWVBFX01BU0s7CgoJcmV0dXJuIF9fY3J5cHRvX2NvbXBfY2FzdChjcnlwdG9fYWxsb2NfYmFzZShhbGdfbmFtZSwgdHlwZSwgbWFzaykpOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fdGZtICpjcnlwdG9fY29tcF90Zm0oc3RydWN0IGNyeXB0b19jb21wICp0Zm0pCnsKCXJldHVybiB0Zm07Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZnJlZV9jb21wKHN0cnVjdCBjcnlwdG9fY29tcCAqdGZtKQp7CgljcnlwdG9fZnJlZV90Zm0oY3J5cHRvX2NvbXBfdGZtKHRmbSkpOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9faGFzX2NvbXAoY29uc3QgY2hhciAqYWxnX25hbWUsIHUzMiB0eXBlLCB1MzIgbWFzaykKewoJdHlwZSAmPSB+Q1JZUFRPX0FMR19UWVBFX01BU0s7Cgl0eXBlIHw9IENSWVBUT19BTEdfVFlQRV9DT01QUkVTUzsKCW1hc2sgfD0gQ1JZUFRPX0FMR19UWVBFX01BU0s7CgoJcmV0dXJuIGNyeXB0b19oYXNfYWxnKGFsZ19uYW1lLCB0eXBlLCBtYXNrKTsKfQoKc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpjcnlwdG9fY29tcF9uYW1lKHN0cnVjdCBjcnlwdG9fY29tcCAqdGZtKQp7CglyZXR1cm4gY3J5cHRvX3RmbV9hbGdfbmFtZShjcnlwdG9fY29tcF90Zm0odGZtKSk7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGNvbXByZXNzX3RmbSAqY3J5cHRvX2NvbXBfY3J0KHN0cnVjdCBjcnlwdG9fY29tcCAqdGZtKQp7CglyZXR1cm4gJmNyeXB0b19jb21wX3RmbSh0Zm0pLT5jcnRfY29tcHJlc3M7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jb21wX2NvbXByZXNzKHN0cnVjdCBjcnlwdG9fY29tcCAqdGZtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKQp7CglyZXR1cm4gY3J5cHRvX2NvbXBfY3J0KHRmbSktPmNvdF9jb21wcmVzcyh0Zm0sIHNyYywgc2xlbiwgZHN0LCBkbGVuKTsKfQoKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NvbXBfZGVjb21wcmVzcyhzdHJ1Y3QgY3J5cHRvX2NvbXAgKnRmbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCnsKCXJldHVybiBjcnlwdG9fY29tcF9jcnQodGZtKS0+Y290X2RlY29tcHJlc3ModGZtLCBzcmMsIHNsZW4sIGRzdCwgZGxlbik7Cn0KCiNlbmRpZgkvKiBfTElOVVhfQ1JZUFRPX0ggKi8KCg==