ZGlmZiAtLWdpdCBhL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L25ldC9teXNvY2tldC5jIGIvYXAvb3MvbGludXgvbGludXgtMy40LngvbmV0L215c29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzlhNWYyNAotLS0gL2Rldi9udWxsCisrKyBiL2FwL29zL2xpbnV4L2xpbnV4LTMuNC54L25ldC9teXNvY2tldC5jCkBAIC0wLDAgKzEsNDMzNSBAQAorLyoKKyAqIE5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFNPQ0tFVCBuZXR3b3JrIGFjY2VzcyBwcm90b2NvbC4KKyAqCisgKiBWZXJzaW9uOglAKCMpc29ja2V0LmMJMS4xLjkzCTE4LzAyLzk1CisgKgorICogQXV0aG9yczoJT3Jlc3QgWmJvcm93c2tpLCA8b2J6QEtvZGFrLkNPTT4KKyAqCQlSb3NzIEJpcm8KKyAqCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCisgKiBGaXhlczoKKyAqCQlBbm9ueW1vdXMJOglOT1RTT0NLL0JBREYgY2xlYW51cC4gRXJyb3IgZml4IGluCisgKgkJCQkJc2h1dGRvd24oKQorICoJCUFsYW4gQ294CToJdmVyaWZ5X2FyZWEoKSBmaXhlcworICoJCUFsYW4gQ294CToJUmVtb3ZlZCBEREkKKyAqCQlKb25hdGhhbiBLYW1lbnMJOglTT0NLX0RHUkFNIHJlY29ubmVjdCBidWcKKyAqCQlBbGFuIENveAk6CU1vdmVkIGEgbG9hZCBvZiBjaGVja3MgdG8gdGhlIHZlcnkKKyAqCQkJCQl0b3AgbGV2ZWwuCisgKgkJQWxhbiBDb3gJOglNb3ZlIGFkZHJlc3Mgc3RydWN0dXJlcyB0by9mcm9tIHVzZXIKKyAqCQkJCQltb2RlIGFib3ZlIHRoZSBwcm90b2NvbCBsYXllcnMuCisgKgkJUm9iIEphbnNzZW4JOglBbGxvdyAwIGxlbmd0aCBzZW5kcy4KKyAqCQlBbGFuIENveAk6CUFzeW5jaHJvbm91cyBJL08gc3VwcG9ydCAoY3JpYmJlZCBmcm9tIHRoZQorICoJCQkJCXR0eSBkcml2ZXJzKS4KKyAqCQlOaWliZSBZdXRha2EJOglBc3luY2hyb25vdXMgSS9PIGZvciB3cml0ZXMgKDQuNEJTRCBzdHlsZSkKKyAqCQlKZWZmIFVwaG9mZgk6CU1hZGUgbWF4IG51bWJlciBvZiBzb2NrZXRzIGNvbW1hbmQtbGluZQorICoJCQkJCWNvbmZpZ3VyYWJsZS4KKyAqCQlNYXR0aSBBYXJuaW8JOglNYWRlIHRoZSBudW1iZXIgb2Ygc29ja2V0cyBkeW5hbWljLAorICoJCQkJCXRvIGJlIGFsbG9jYXRlZCB3aGVuIG5lZWRlZCwgYW5kIG1yLgorICoJCQkJCVVwaG9mZidzIG1heCBpcyB1c2VkIGFzIG1heCB0byBiZQorICoJCQkJCWFsbG93ZWQgdG8gYWxsb2NhdGUuCisgKgkJTGludXMJCToJQXJnaC4gcmVtb3ZlZCBhbGwgdGhlIHNvY2tldCBhbGxvY2F0aW9uCisgKgkJCQkJYWx0b2dldGhlcjogaXQncyBpbiB0aGUgaW5vZGUgbm93LgorICoJCUFsYW4gQ294CToJTWFkZSBzb2NrX2FsbG9jKCkvc29ja19yZWxlYXNlKCkgcHVibGljCisgKgkJCQkJZm9yIE5ldFJPTSBhbmQgZnV0dXJlIGtlcm5lbCBuZnNkIHR5cGUKKyAqCQkJCQlzdHVmZi4KKyAqCQlBbGFuIENveAk6CXNlbmRtc2cvcmVjdm1zZyBiYXNpY3MuCisgKgkJVG9tIER5YXMJOglFeHBvcnQgbmV0IHN5bWJvbHMuCisgKgkJTWFyY2luIERhbGVja2kJOglGaXhlZCBwcm9ibGVtcyB3aXRoIENPTkZJR19ORVQ9Im4iLgorICoJCUFsYW4gQ294CToJQWRkZWQgdGhyZWFkIGxvY2tpbmcgdG8gc3lzXyogY2FsbHMKKyAqCQkJCQlmb3Igc29ja2V0cy4gTWF5IGhhdmUgZXJyb3JzIGF0IHRoZQorICoJCQkJCW1vbWVudC4KKyAqCQlLZXZpbiBCdWhyCToJRml4ZWQgdGhlIGR1bWIgZXJyb3JzIGluIHRoZSBhYm92ZS4KKyAqCQlBbmRpIEtsZWVuCToJU29tZSBzbWFsbCBjbGVhbnVwcywgb3B0aW1pemF0aW9ucywKKyAqCQkJCQlhbmQgZml4ZWQgYSBjb3B5X2Zyb21fdXNlcigpIGJ1Zy4KKyAqCQlUaWdyYW4gQWl2YXppYW4JOglzeXNfc2VuZChhcmdzKSBjYWxscyBzeXNfc2VuZHRvKGFyZ3MsIE5VTEwsIDApCisgKgkJVGlncmFuIEFpdmF6aWFuCToJTWFkZSBsaXN0ZW4oMikgYmFja2xvZyBzYW5pdHkgY2hlY2tzCisgKgkJCQkJcHJvdG9jb2wtaW5kZXBlbmRlbnQKKyAqCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqCVRoaXMgbW9kdWxlIGlzIGVmZmVjdGl2ZWx5IHRoZSB0b3AgbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBCU0Qgc29ja2V0CisgKglwYXJhZGlnbS4KKyAqCisgKglCYXNlZCB1cG9uIFN3YW5zZWEgVW5pdmVyc2l0eSBDb21wdXRlciBTb2NpZXR5IE5FVDMuMDM5CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhbnJvdXRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2JyaWRnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2ZyYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L25zcHJveHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCisjaW5jbHVkZSA8bmV0L2NvbXBhdC5oPgorI2luY2x1ZGUgPG5ldC93ZXh0Lmg+CisjaW5jbHVkZSA8bmV0L2Nsc19jZ3JvdXAuaD4KKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pZl90dW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2X3JvdXRlLmg+CisjaW5jbHVkZSA8bGludXgvcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8bGludXgvYXRhbGsuaD4KKworCisjZGVmaW5lIENPTVBBVF9NU0cobXNnLCBtZW1iZXIpCSgoTVNHX0NNU0dfQ09NUEFUICYgZmxhZ3MpID8gJm1zZyMjX2NvbXBhdC0+bWVtYmVyIDogJm1zZy0+bWVtYmVyKQorI2RlZmluZSBDT01QQVRfTkFNRUxFTihtc2cpCUNPTVBBVF9NU0cobXNnLCBtc2dfbmFtZWxlbikKKyNkZWZpbmUgQ09NUEFUX0ZMQUdTKG1zZykJQ09NUEFUX01TRyhtc2csIG1zZ19mbGFncykKK3N0YXRpYyBpbnQgc29ja19ub19vcGVuKHN0cnVjdCBpbm9kZSAqaXJyZWxldmFudCwgc3RydWN0IGZpbGUgKmRvbnRjYXJlKTsKK3N0YXRpYyBzc2l6ZV90IHNvY2tfYWlvX3JlYWQoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKKwkJCSB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBwb3MpOworc3RhdGljIHNzaXplX3Qgc29ja19haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKKwkJCSAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKTsKK3N0YXRpYyBpbnQgc29ja19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisKK3N0YXRpYyBpbnQgc29ja19jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgdW5zaWduZWQgaW50IHNvY2tfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCk7CitzdGF0aWMgbG9uZyBzb2NrX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIGxvbmcgY29tcGF0X3NvY2tfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisjZW5kaWYKK3N0YXRpYyBpbnQgc29ja19mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IG9uKTsKK3N0YXRpYyBzc2l6ZV90IHNvY2tfc2VuZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgICBpbnQgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgbG9mZl90ICpwcG9zLCBpbnQgbW9yZSk7CitzdGF0aWMgc3NpemVfdCBzb2NrX3NwbGljZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgKnBwb3MsCisJCQkJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc2l6ZV90IGxlbiwKKwkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpOworZXh0ZXJuIGludCBfX215Z2V0X3VzZXJfMSh2b2lkICopOworZXh0ZXJuIGludCBfX215Z2V0X3VzZXJfMih2b2lkICopOworZXh0ZXJuIGludCBfX215Z2V0X3VzZXJfNCh2b2lkICopOworCisKKy8qCisgKglTb2NrZXQgZmlsZXMgaGF2ZSBhIHNldCBvZiAnc3BlY2lhbCcgb3BlcmF0aW9ucyBhcyB3ZWxsIGFzIHRoZSBnZW5lcmljIGZpbGUgb25lcy4gVGhlc2UgZG9uJ3QgYXBwZWFyCisgKglpbiB0aGUgb3BlcmF0aW9uIHN0cnVjdHVyZXMgYnV0IGFyZSBkb25lIGRpcmVjdGx5IHZpYSB0aGUgc29ja2V0Y2FsbCgpIG11bHRpcGxleG9yLgorICovCisvKgorICogaTog5YaF5qC45pWw5o2u77w/ICogcDog55So5oi356m66Ze05oyH6ZKICisgKiDov5Tlm57lgD8g5oiQ5Yqf5pe26L+U5Zs/CisgKi8KKyNpZiAwCitzdGF0aWMgaW50IG15cHV0X3VzZXIoY2hhciBpLCBjaGFyICpwKQoreworCW1lbWNweShwLCAmaSwgMSk7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IG15Z2V0X3VzZXIodm9pZCAqaSwgY2hhciAqcCkKK3sKKwltZW1jcHkoaSwgcCwgMSk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc29ja2V0X2ZpbGVfb3BzID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5sbHNlZWsgPQlub19sbHNlZWssCisJLmFpb19yZWFkID0Jc29ja19haW9fcmVhZCwKKwkuYWlvX3dyaXRlID0Jc29ja19haW9fd3JpdGUsCisJLnBvbGwgPQkJc29ja19wb2xsLAorCS51bmxvY2tlZF9pb2N0bCA9IHNvY2tfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwgPSBjb21wYXRfc29ja19pb2N0bCwKKyNlbmRpZgorCS5tbWFwID0JCXNvY2tfbW1hcCwKKwkub3BlbiA9CQlzb2NrX25vX29wZW4sCS8qIHNwZWNpYWwgb3BlbiBjb2RlIHRvIGRpc2FsbG93IG9wZW4gdmlhIC9wcm9jICovCisJLnJlbGVhc2UgPQlzb2NrX2Nsb3NlLAorCS5mYXN5bmMgPQlzb2NrX2Zhc3luYywKKwkuc2VuZHBhZ2UgPQlzb2NrX3NlbmRwYWdlLAorCS5zcGxpY2Vfd3JpdGUgPSBnZW5lcmljX3NwbGljZV9zZW5kcGFnZSwKKwkuc3BsaWNlX3JlYWQgPQlzb2NrX3NwbGljZV9yZWFkLAorfTsKKworLyoKKyAqCVRoZSBwcm90b2NvbCBsaXN0LiBFYWNoIHByb3RvY29sIGlzIHJlZ2lzdGVyZWQgaW4gaGVyZS4KKyAqLworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG5ldF9mYW1pbHlfbG9jayk7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9wcm90b19mYW1pbHkgX19yY3UgKm5ldF9mYW1pbGllc1tOUFJPVE9dIF9fcmVhZF9tb3N0bHk7CisKKy8qCisgKglTdGF0aXN0aWNzIGNvdW50ZXJzIG9mIHRoZSBzb2NrZXQgbGlzdHMKKyAqLworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBzb2NrZXRzX2luX3VzZSk7CisKKy8qCisgKiBTdXBwb3J0IHJvdXRpbmVzLgorICogTW92ZSBzb2NrZXQgYWRkcmVzc2VzIGJhY2sgYW5kIGZvcnRoIGFjcm9zcyB0aGUga2VybmVsL3VzZXIKKyAqIGRpdmlkZSBhbmQgbG9vayBhZnRlciB0aGUgbWVzc3kgYml0cy4KKyAqLworCisvKioKKyAqCW1vdmVfYWRkcl90b19rZXJuZWwJLQljb3B5IGEgc29ja2V0IGFkZHJlc3MgaW50byBrZXJuZWwgc3BhY2UKKyAqCUB1YWRkcjogQWRkcmVzcyBpbiB1c2VyIHNwYWNlCisgKglAa2FkZHI6IEFkZHJlc3MgaW4ga2VybmVsIHNwYWNlCisgKglAdWxlbjogTGVuZ3RoIGluIHVzZXIgc3BhY2UKKyAqCisgKglUaGUgYWRkcmVzcyBpcyBjb3BpZWQgaW50byBrZXJuZWwgc3BhY2UuIElmIHRoZSBwcm92aWRlZCBhZGRyZXNzIGlzCisgKgl0b28gbG9uZyBhbiBlcnJvciBjb2RlIG9mIC1FSU5WQUwgaXMgcmV0dXJuZWQuIElmIHRoZSBjb3B5IGdpdmVzCisgKglpbnZhbGlkIGFkZHJlc3NlcyAtRUZBVUxUIGlzIHJldHVybmVkLiBPbiBhIHN1Y2Nlc3MgMCBpcyByZXR1cm5lZC4KKyAqLworCitpbnQgbW92ZV9hZGRyX3RvX2tlcm5lbCh2b2lkIF9fdXNlciAqdWFkZHIsIGludCB1bGVuLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqa2FkZHIpCit7CisJaWYgKHVsZW4gPCAwIHx8IHVsZW4gPiBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodWxlbiA9PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoY29weV9mcm9tX3VzZXIoa2FkZHIsIHVhZGRyLCB1bGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIGF1ZGl0X3NvY2thZGRyKHVsZW4sIGthZGRyKTsKK30KKworLy9jb21sZWUKK2ludCBteW1vdmVfYWRkcl90b19rZXJuZWwodm9pZCBfX3VzZXIgKnVhZGRyLCBpbnQgdWxlbiwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmthZGRyKQoreworLy8Ja2FkZHIgPSAoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKil1YWRkcjsKKyNpZiAxCisJaWYgKHVsZW4gPCAwIHx8IHVsZW4gPiBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodWxlbiA9PSAwKQorCQlyZXR1cm4gMDsKKwltZW1jcHkoa2FkZHIsIHVhZGRyLCB1bGVuKTsKKyNlbmRpZgorCXJldHVybiBhdWRpdF9zb2NrYWRkcih1bGVuLCBrYWRkcik7Cit9CisvKioKKyAqCW1vdmVfYWRkcl90b191c2VyCS0JY29weSBhbiBhZGRyZXNzIHRvIHVzZXIgc3BhY2UKKyAqCUBrYWRkcjoga2VybmVsIHNwYWNlIGFkZHJlc3MKKyAqCUBrbGVuOiBsZW5ndGggb2YgYWRkcmVzcyBpbiBrZXJuZWwKKyAqCUB1YWRkcjogdXNlciBzcGFjZSBhZGRyZXNzCisgKglAdWxlbjogcG9pbnRlciB0byB1c2VyIGxlbmd0aCBmaWVsZAorICoKKyAqCVRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5IHVsZW4gb24gZW50cnkgaXMgdGhlIGJ1ZmZlciBsZW5ndGggYXZhaWxhYmxlLgorICoJVGhpcyBpcyBvdmVyd3JpdHRlbiB3aXRoIHRoZSBidWZmZXIgc3BhY2UgdXNlZC4gLUVJTlZBTCBpcyByZXR1cm5lZAorICoJaWYgYW4gb3ZlcmxvbmcgYnVmZmVyIGlzIHNwZWNpZmllZCBvciBhIG5lZ2F0aXZlIGJ1ZmZlciBzaXplLiAtRUZBVUxUCisgKglpcyByZXR1cm5lZCBpZiBlaXRoZXIgdGhlIGJ1ZmZlciBvciB0aGUgbGVuZ3RoIGZpZWxkIGFyZSBub3QKKyAqCWFjY2Vzc2libGUuCisgKglBZnRlciBjb3B5aW5nIHRoZSBkYXRhIHVwIHRvIHRoZSBsaW1pdCB0aGUgdXNlciBzcGVjaWZpZXMsIHRoZSB0cnVlCisgKglsZW5ndGggb2YgdGhlIGRhdGEgaXMgd3JpdHRlbiBvdmVyIHRoZSBsZW5ndGggbGltaXQgdGhlIHVzZXIKKyAqCXNwZWNpZmllZC4gWmVybyBpcyByZXR1cm5lZCBmb3IgYSBzdWNjZXNzLgorICovCisKK3N0YXRpYyBpbnQgbW92ZV9hZGRyX3RvX3VzZXIoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmthZGRyLCBpbnQga2xlbiwKKwkJCSAgICAgdm9pZCBfX3VzZXIgKnVhZGRyLCBpbnQgX191c2VyICp1bGVuKQoreworCWludCBlcnI7CisJaW50IGxlbjsKKworCUJVR19PTihrbGVuID4gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKSk7CisJZXJyID0gZ2V0X3VzZXIobGVuLCB1bGVuKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWlmIChsZW4gPiBrbGVuKQorCQlsZW4gPSBrbGVuOworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobGVuKSB7CisJCWlmIChhdWRpdF9zb2NrYWRkcihrbGVuLCBrYWRkcikpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKGNvcHlfdG9fdXNlcih1YWRkciwga2FkZHIsIGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJLyoKKwkgKiAgICAgICJmcm9tbGVuIHNoYWxsIHJlZmVyIHRvIHRoZSB2YWx1ZSBiZWZvcmUgdHJ1bmNhdGlvbi4uIgorCSAqICAgICAgICAgICAgICAgICAgICAgIDEwMDMuMWcKKwkgKi8KKwlyZXR1cm4gX19wdXRfdXNlcihrbGVuLCB1bGVuKTsKK30KKy8vY29tbGVlCitzdGF0aWMgaW50IG15bW92ZV9hZGRyX3RvX3VzZXIoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmthZGRyLCBpbnQga2xlbiwKKwkJCSAgICAgdm9pZCBfX3VzZXIgKnVhZGRyLCBpbnQgX191c2VyICp1bGVuKQoreworCWludCBlcnI7CisJaW50IGxlbjsKKworCUJVR19PTihrbGVuID4gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKSk7CisJZXJyID0gbXlnZXRfdXNlcihsZW4sIHVsZW4pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJaWYgKGxlbiA+IGtsZW4pCisJCWxlbiA9IGtsZW47CisJaWYgKGxlbiA8IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChsZW4pIHsKKwkJaWYgKGF1ZGl0X3NvY2thZGRyKGtsZW4sIGthZGRyKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQltZW1jcHkodWFkZHIsIGthZGRyLCBsZW4pOworCX0KKwkvKgorCSAqICAgICAgImZyb21sZW4gc2hhbGwgcmVmZXIgdG8gdGhlIHZhbHVlIGJlZm9yZSB0cnVuY2F0aW9uLi4iCisJICogICAgICAgICAgICAgICAgICAgICAgMTAwMy4xZworCSAqLworCXJldHVybiBteXB1dF91c2VyKGtsZW4sIHVsZW4pOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqc29ja19pbm9kZV9jYWNoZXAgX19yZWFkX21vc3RseTsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqc29ja19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBzb2NrZXRfYWxsb2MgKmVpOworCXN0cnVjdCBzb2NrZXRfd3EgKndxOworCWVpID0ga21lbV9jYWNoZV9hbGxvYyhzb2NrX2lub2RlX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisgICAgbmV0c2xhYl9pbmMoTVlTT0NLRVRfU0xBQik7CisJd3EgPSBrbWFsbG9jKHNpemVvZigqd3EpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdxKSB7CisJICAgIG5ldHNsYWJfZGVjKE1ZU09DS0VUX1NMQUIpOworCQlrbWVtX2NhY2hlX2ZyZWUoc29ja19pbm9kZV9jYWNoZXAsIGVpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndxLT53YWl0KTsKKwl3cS0+ZmFzeW5jX2xpc3QgPSBOVUxMOworCVJDVV9JTklUX1BPSU5URVIoZWktPnNvY2tldC53cSwgd3EpOworCisJZWktPnNvY2tldC5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOworCWVpLT5zb2NrZXQuZmxhZ3MgPSAwOworCWVpLT5zb2NrZXQub3BzID0gTlVMTDsKKwllaS0+c29ja2V0LnNrID0gTlVMTDsKKwllaS0+c29ja2V0LmZpbGUgPSBOVUxMOworCisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBzb2NrX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3Qgc29ja2V0X2FsbG9jICplaTsKKwlzdHJ1Y3Qgc29ja2V0X3dxICp3cTsKKworCWVpID0gY29udGFpbmVyX29mKGlub2RlLCBzdHJ1Y3Qgc29ja2V0X2FsbG9jLCB2ZnNfaW5vZGUpOworCXdxID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChlaS0+c29ja2V0LndxLCAxKTsKKwlrZnJlZV9yY3Uod3EsIHJjdSk7CisgICAgbmV0c2xhYl9kZWMoTVlTT0NLRVRfU0xBQik7CisJa21lbV9jYWNoZV9mcmVlKHNvY2tfaW5vZGVfY2FjaGVwLCBlaSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpmb28pCit7CisJc3RydWN0IHNvY2tldF9hbGxvYyAqZWkgPSAoc3RydWN0IHNvY2tldF9hbGxvYyAqKWZvbzsKKworCWlub2RlX2luaXRfb25jZSgmZWktPnZmc19pbm9kZSk7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9pbm9kZWNhY2hlKHZvaWQpCit7CisJc29ja19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgic29ja19pbm9kZV9jYWNoZSIsCisJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc29ja2V0X2FsbG9jKSwKKwkJCQkJICAgICAgMCwKKwkJCQkJICAgICAgKFNMQUJfSFdDQUNIRV9BTElHTiB8CisJCQkJCSAgICAgICBTTEFCX1JFQ0xBSU1fQUNDT1VOVCB8CisJCQkJCSAgICAgICBTTEFCX01FTV9TUFJFQUQpLAorCQkJCQkgICAgICBpbml0X29uY2UpOworCWlmIChzb2NrX2lub2RlX2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHNvY2tmc19vcHMgPSB7CisJLmFsbG9jX2lub2RlCT0gc29ja19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IHNvY2tfZGVzdHJveV9pbm9kZSwKKwkuc3RhdGZzCQk9IHNpbXBsZV9zdGF0ZnMsCit9OworCisvKgorICogc29ja2ZzX2RuYW1lKCkgaXMgY2FsbGVkIGZyb20gZF9wYXRoKCkuCisgKi8KK3N0YXRpYyBjaGFyICpzb2NrZnNfZG5hbWUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIGludCBidWZsZW4pCit7CisJcmV0dXJuIGR5bmFtaWNfZG5hbWUoZGVudHJ5LCBidWZmZXIsIGJ1ZmxlbiwgInNvY2tldDpbJWx1XSIsCisJCQkJZGVudHJ5LT5kX2lub2RlLT5pX2lubyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgc29ja2ZzX2RlbnRyeV9vcGVyYXRpb25zID0geworCS5kX2RuYW1lICA9IHNvY2tmc19kbmFtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpzb2NrZnNfbW91bnQoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gbW91bnRfcHNldWRvKGZzX3R5cGUsICJzb2NrZXQ6IiwgJnNvY2tmc19vcHMsCisJCSZzb2NrZnNfZGVudHJ5X29wZXJhdGlvbnMsIFNPQ0tGU19NQUdJQyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKnNvY2tfbW50IF9fcmVhZF9tb3N0bHk7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBzb2NrX2ZzX3R5cGUgPSB7CisJLm5hbWUgPQkJInNvY2tmcyIsCisJLm1vdW50ID0Jc29ja2ZzX21vdW50LAorCS5raWxsX3NiID0Ja2lsbF9hbm9uX3N1cGVyLAorfTsKKworLyoKKyAqCU9idGFpbnMgdGhlIGZpcnN0IGF2YWlsYWJsZSBmaWxlIGRlc2NyaXB0b3IgYW5kIHNldHMgaXQgdXAgZm9yIHVzZS4KKyAqCisgKglUaGVzZSBmdW5jdGlvbnMgY3JlYXRlIGZpbGUgc3RydWN0dXJlcyBhbmQgbWFwcyB0aGVtIHRvIGZkIHNwYWNlCisgKglvZiB0aGUgY3VycmVudCBwcm9jZXNzLiBPbiBzdWNjZXNzIGl0IHJldHVybnMgZmlsZSBkZXNjcmlwdG9yCisgKglhbmQgZmlsZSBzdHJ1Y3QgaW1wbGljaXRseSBzdG9yZWQgaW4gc29jay0+ZmlsZS4KKyAqCU5vdGUgdGhhdCBhbm90aGVyIHRocmVhZCBtYXkgY2xvc2UgZmlsZSBkZXNjcmlwdG9yIGJlZm9yZSB3ZSByZXR1cm4KKyAqCWZyb20gdGhpcyBmdW5jdGlvbi4gV2UgdXNlIHRoZSBmYWN0IHRoYXQgbm93IHdlIGRvIG5vdCByZWZlcgorICoJdG8gc29ja2V0IGFmdGVyIG1hcHBpbmcuIElmIG9uZSBkYXkgd2Ugd2lsbCBuZWVkIGl0LCB0aGlzCisgKglmdW5jdGlvbiB3aWxsIGluY3JlbWVudCByZWYuIGNvdW50IG9uIGZpbGUgYnkgMS4KKyAqCisgKglJbiBhbnkgY2FzZSByZXR1cm5lZCBmZCBNQVkgQkUgbm90IHZhbGlkIQorICoJVGhpcyByYWNlIGNvbmRpdGlvbiBpcyB1bmF2b2lkYWJsZQorICoJd2l0aCBzaGFyZWQgZmQgc3BhY2VzLCB3ZSBjYW5ub3Qgc29sdmUgaXQgaW5zaWRlIGtlcm5lbCwKKyAqCWJ1dCB3ZSB0YWtlIGNhcmUgb2YgaW50ZXJuYWwgY29oZXJlbmNlIHlldC4KKyAqLworCitzdGF0aWMgaW50IHNvY2tfYWxsb2NfZmlsZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgZmlsZSAqKmYsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgcXN0ciBuYW1lID0geyAubmFtZSA9ICIiIH07CisJc3RydWN0IHBhdGggcGF0aDsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlpbnQgZmQ7CisKKwlmZCA9IGdldF91bnVzZWRfZmRfZmxhZ3MoZmxhZ3MpOworCWlmICh1bmxpa2VseShmZCA8IDApKQorCQlyZXR1cm4gZmQ7CisKKwlwYXRoLmRlbnRyeSA9IGRfYWxsb2NfcHNldWRvKHNvY2tfbW50LT5tbnRfc2IsICZuYW1lKTsKKwlpZiAodW5saWtlbHkoIXBhdGguZGVudHJ5KSkgeworCQlwdXRfdW51c2VkX2ZkKGZkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXBhdGgubW50ID0gbW50Z2V0KHNvY2tfbW50KTsKKworCWRfaW5zdGFudGlhdGUocGF0aC5kZW50cnksIFNPQ0tfSU5PREUoc29jaykpOworCVNPQ0tfSU5PREUoc29jayktPmlfZm9wID0gJnNvY2tldF9maWxlX29wczsKKworCWZpbGUgPSBhbGxvY19maWxlKCZwYXRoLCBGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUsCisJCSAgJnNvY2tldF9maWxlX29wcyk7CisJaWYgKHVubGlrZWx5KCFmaWxlKSkgeworCQkvKiBkcm9wIGRlbnRyeSwga2VlcCBpbm9kZSAqLworCQlpaG9sZChwYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJCXBhdGhfcHV0KCZwYXRoKTsKKwkJcHV0X3VudXNlZF9mZChmZCk7CisJCXJldHVybiAtRU5GSUxFOworCX0KKworCXNvY2stPmZpbGUgPSBmaWxlOworCWZpbGUtPmZfZmxhZ3MgPSBPX1JEV1IgfCAoZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwlmaWxlLT5mX3BvcyA9IDA7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gc29jazsKKworCSpmID0gZmlsZTsKKwlyZXR1cm4gZmQ7Cit9CisKK2ludCBzb2NrX21hcF9mZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGZpbGUgKm5ld2ZpbGU7CisJaW50IGZkID0gc29ja19hbGxvY19maWxlKHNvY2ssICZuZXdmaWxlLCBmbGFncyk7CisKKwlpZiAobGlrZWx5KGZkID49IDApKQorCQlmZF9pbnN0YWxsKGZkLCBuZXdmaWxlKTsKKworCXJldHVybiBmZDsKK30KK0VYUE9SVF9TWU1CT0woc29ja19tYXBfZmQpOworCitzdGF0aWMgc3RydWN0IHNvY2tldCAqc29ja19mcm9tX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIGludCAqZXJyKQoreworCWlmIChmaWxlLT5mX29wID09ICZzb2NrZXRfZmlsZV9vcHMpCisJCXJldHVybiBmaWxlLT5wcml2YXRlX2RhdGE7CS8qIHNldCBpbiBzb2NrX21hcF9mZCAqLworCisJKmVyciA9IC1FTk9UU09DSzsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKglzb2NrZmRfbG9va3VwIC0gR28gZnJvbSBhIGZpbGUgbnVtYmVyIHRvIGl0cyBzb2NrZXQgc2xvdAorICoJQGZkOiBmaWxlIGhhbmRsZQorICoJQGVycjogcG9pbnRlciB0byBhbiBlcnJvciBjb2RlIHJldHVybgorICoKKyAqCVRoZSBmaWxlIGhhbmRsZSBwYXNzZWQgaW4gaXMgbG9ja2VkIGFuZCB0aGUgc29ja2V0IGl0IGlzIGJvdW5kCisgKgl0b28gaXMgcmV0dXJuZWQuIElmIGFuIGVycm9yIG9jY3VycyB0aGUgZXJyIHBvaW50ZXIgaXMgb3ZlcndyaXR0ZW4KKyAqCXdpdGggYSBuZWdhdGl2ZSBlcnJubyBjb2RlIGFuZCBOVUxMIGlzIHJldHVybmVkLiBUaGUgZnVuY3Rpb24gY2hlY2tzCisgKglmb3IgYm90aCBpbnZhbGlkIGhhbmRsZXMgYW5kIHBhc3NpbmcgYSBoYW5kbGUgd2hpY2ggaXMgbm90IGEgc29ja2V0LgorICoKKyAqCU9uIGEgc3VjY2VzcyB0aGUgc29ja2V0IG9iamVjdCBwb2ludGVyIGlzIHJldHVybmVkLgorICovCisKK3N0cnVjdCBzb2NrZXQgKnNvY2tmZF9sb29rdXAoaW50IGZkLCBpbnQgKmVycikKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCisJZmlsZSA9IGZnZXQoZmQpOworCWlmICghZmlsZSkgeworCQkqZXJyID0gLUVCQURGOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzb2NrID0gc29ja19mcm9tX2ZpbGUoZmlsZSwgZXJyKTsKKwlpZiAoIXNvY2spCisJCWZwdXQoZmlsZSk7CisJcmV0dXJuIHNvY2s7Cit9CitFWFBPUlRfU1lNQk9MKHNvY2tmZF9sb29rdXApOworCitzdGF0aWMgc3RydWN0IHNvY2tldCAqc29ja2ZkX2xvb2t1cF9saWdodChpbnQgZmQsIGludCAqZXJyLCBpbnQgKmZwdXRfbmVlZGVkKQoreworCXN0cnVjdCBmaWxlICpmaWxlOworCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisKKwkqZXJyID0gLUVCQURGOworCWZpbGUgPSBmZ2V0X2xpZ2h0KGZkLCBmcHV0X25lZWRlZCk7CisJaWYgKGZpbGUpIHsKKwkJc29jayA9IHNvY2tfZnJvbV9maWxlKGZpbGUsIGVycik7CisJCWlmIChzb2NrKQorCQkJcmV0dXJuIHNvY2s7CisJCWZwdXRfbGlnaHQoZmlsZSwgKmZwdXRfbmVlZGVkKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICoJc29ja19hbGxvYwktCWFsbG9jYXRlIGEgc29ja2V0CisgKgorICoJQWxsb2NhdGUgYSBuZXcgaW5vZGUgYW5kIHNvY2tldCBvYmplY3QuIFRoZSB0d28gYXJlIGJvdW5kIHRvZ2V0aGVyCisgKglhbmQgaW5pdGlhbGlzZWQuIFRoZSBzb2NrZXQgaXMgdGhlbiByZXR1cm5lZC4gSWYgd2UgYXJlIG91dCBvZiBpbm9kZXMKKyAqCU5VTEwgaXMgcmV0dXJuZWQuCisgKi8KKworc3RhdGljIHN0cnVjdCBzb2NrZXQgKnNvY2tfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisKKwlpbm9kZSA9IG5ld19pbm9kZV9wc2V1ZG8oc29ja19tbnQtPm1udF9zYik7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzb2NrID0gU09DS0VUX0koaW5vZGUpOworCisJa21lbWNoZWNrX2Fubm90YXRlX2JpdGZpZWxkKHNvY2ssIHR5cGUpOworCWlub2RlLT5pX2lubyA9IGdldF9uZXh0X2lubygpOworCWlub2RlLT5pX21vZGUgPSBTX0lGU09DSyB8IFNfSVJXWFVHTzsKKwlpbm9kZS0+aV91aWQgPSBjdXJyZW50X2ZzdWlkKCk7CisJaW5vZGUtPmlfZ2lkID0gY3VycmVudF9mc2dpZCgpOworCisJcGVyY3B1X2FkZChzb2NrZXRzX2luX3VzZSwgMSk7CisJcmV0dXJuIHNvY2s7Cit9CisKKy8qCisgKglJbiB0aGVvcnkgeW91IGNhbid0IGdldCBhbiBvcGVuIG9uIHRoaXMgaW5vZGUsIGJ1dCAvcHJvYyBwcm92aWRlcworICoJYSBiYWNrIGRvb3IuIFJlbWVtYmVyIHRvIGtlZXAgaXQgc2h1dCBvdGhlcndpc2UgeW91J2xsIGxldCB0aGUKKyAqCWNyZWVweSBjcmF3bGllcyBpbi4KKyAqLworCitzdGF0aWMgaW50IHNvY2tfbm9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlycmVsZXZhbnQsIHN0cnVjdCBmaWxlICpkb250Y2FyZSkKK3sKKwlyZXR1cm4gLUVOWElPOworfQorCitjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJhZF9zb2NrX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBzb2NrX25vX29wZW4sCisJLmxsc2VlayA9IG5vb3BfbGxzZWVrLAorfTsKKworLyoqCisgKglzb2NrX3JlbGVhc2UJLQljbG9zZSBhIHNvY2tldAorICoJQHNvY2s6IHNvY2tldCB0byBjbG9zZQorICoKKyAqCVRoZSBzb2NrZXQgaXMgcmVsZWFzZWQgZnJvbSB0aGUgcHJvdG9jb2wgc3RhY2sgaWYgaXQgaGFzIGEgcmVsZWFzZQorICoJY2FsbGJhY2ssIGFuZCB0aGUgaW5vZGUgaXMgdGhlbiByZWxlYXNlZCBpZiB0aGUgc29ja2V0IGlzIGJvdW5kIHRvCisgKglhbiBpbm9kZSBub3QgYSBmaWxlLgorICovCisKK3ZvaWQgc29ja19yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJaWYgKHNvY2stPm9wcykgeworCQlzdHJ1Y3QgbW9kdWxlICpvd25lciA9IHNvY2stPm9wcy0+b3duZXI7CisKKwkJc29jay0+b3BzLT5yZWxlYXNlKHNvY2spOworCQlzb2NrLT5vcHMgPSBOVUxMOworCQltb2R1bGVfcHV0KG93bmVyKTsKKwl9CisKKwlpZiAocmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChzb2NrLT53cSwgMSktPmZhc3luY19saXN0KQorCQlwcmludF9zdW4oU1VOX0VSUiwic29ja19yZWxlYXNlOiBmYXN5bmMgbGlzdCBub3QgZW1wdHkhXG4iKTsKKworCWlmICh0ZXN0X2JpdChTT0NLX0VYVEVSTkFMTFlfQUxMT0NBVEVELCAmc29jay0+ZmxhZ3MpKQorCQlyZXR1cm47CisKKwlwZXJjcHVfc3ViKHNvY2tldHNfaW5fdXNlLCAxKTsKKwlpZiAoIXNvY2stPmZpbGUpIHsKKwkJaXB1dChTT0NLX0lOT0RFKHNvY2spKTsKKwkJcmV0dXJuOworCX0KKwlzb2NrLT5maWxlID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woc29ja19yZWxlYXNlKTsKKworaW50IHNvY2tfdHhfdGltZXN0YW1wKHN0cnVjdCBzb2NrICpzaywgX191OCAqdHhfZmxhZ3MpCit7CisJKnR4X2ZsYWdzID0gMDsKKwlpZiAoc29ja19mbGFnKHNrLCBTT0NLX1RJTUVTVEFNUElOR19UWF9IQVJEV0FSRSkpCisJCSp0eF9mbGFncyB8PSBTS0JUWF9IV19UU1RBTVA7CisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19USU1FU1RBTVBJTkdfVFhfU09GVFdBUkUpKQorCQkqdHhfZmxhZ3MgfD0gU0tCVFhfU1dfVFNUQU1QOworCWlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfV0lGSV9TVEFUVVMpKQorCQkqdHhfZmxhZ3MgfD0gU0tCVFhfV0lGSV9TVEFUVVM7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHNvY2tfdHhfdGltZXN0YW1wKTsKKworc3RhdGljIGlubGluZSBpbnQgX19zb2NrX3NlbmRtc2dfbm9zZWMoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJCSAgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBzb2NrX2lvY2IgKnNpID0ga2lvY2JfdG9fc2lvY2IoaW9jYik7CisKKwlzb2NrX3VwZGF0ZV9jbGFzc2lkKHNvY2stPnNrKTsKKworCXNvY2tfdXBkYXRlX25ldHByaW9pZHgoc29jay0+c2spOworCisJc2ktPnNvY2sgPSBzb2NrOworCXNpLT5zY20gPSBOVUxMOworCXNpLT5tc2cgPSBtc2c7CisJc2ktPnNpemUgPSBzaXplOworCisJcmV0dXJuIHNvY2stPm9wcy0+c2VuZG1zZyhpb2NiLCBzb2NrLCBtc2csIHNpemUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX3NvY2tfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkJIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUpCit7CisJaW50IGVyciA9IHNlY3VyaXR5X3NvY2tldF9zZW5kbXNnKHNvY2ssIG1zZywgc2l6ZSk7CisKKwlwcmludF9zdW4oU1VOX0RCRywiW2NvbWxlZV06X19zb2NrX3NlbmRtc2c9PT4lZFxuIiwgZXJyKTsKKwlyZXR1cm4gZXJyID86IF9fc29ja19zZW5kbXNnX25vc2VjKGlvY2IsIHNvY2ssIG1zZywgc2l6ZSk7Cit9CisKK2ludCBzb2NrX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qga2lvY2IgaW9jYjsKKwlzdHJ1Y3Qgc29ja19pb2NiIHNpb2NiOworCWludCByZXQ7CisKKwlpbml0X3N5bmNfa2lvY2IoJmlvY2IsIE5VTEwpOworCWlvY2IucHJpdmF0ZSA9ICZzaW9jYjsKKyAgICByZWNvcmRfYXBwX2F0Y2l2ZV9uZXQoKTsKKwlyZXQgPSBfX3NvY2tfc2VuZG1zZygmaW9jYiwgc29jaywgbXNnLCBzaXplKTsKKwlpZiAoLUVJT0NCUVVFVUVEID09IHJldCkKKwl7CisJCXJldCA9IHdhaXRfb25fc3luY19raW9jYigmaW9jYik7CisJfQorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHNvY2tfc2VuZG1zZyk7CisKK3N0YXRpYyBpbnQgc29ja19zZW5kbXNnX25vc2VjKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGtpb2NiIGlvY2I7CisJc3RydWN0IHNvY2tfaW9jYiBzaW9jYjsKKwlpbnQgcmV0OworCisJaW5pdF9zeW5jX2tpb2NiKCZpb2NiLCBOVUxMKTsKKwlpb2NiLnByaXZhdGUgPSAmc2lvY2I7CisJcmV0ID0gX19zb2NrX3NlbmRtc2dfbm9zZWMoJmlvY2IsIHNvY2ssIG1zZywgc2l6ZSk7CisJaWYgKC1FSU9DQlFVRVVFRCA9PSByZXQpCisJCXJldCA9IHdhaXRfb25fc3luY19raW9jYigmaW9jYik7CisJcmV0dXJuIHJldDsKK30KKworaW50IGtlcm5lbF9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJICAgc3RydWN0IGt2ZWMgKnZlYywgc2l6ZV90IG51bSwgc2l6ZV90IHNpemUpCit7CisJbW1fc2VnbWVudF90IG9sZGZzID0gZ2V0X2ZzKCk7CisJaW50IHJlc3VsdDsKKworCXNldF9mcyhLRVJORUxfRFMpOworCS8qCisJICogdGhlIGZvbGxvd2luZyBpcyBzYWZlLCBzaW5jZSBmb3IgY29tcGlsZXIgZGVmaW5pdGlvbnMgb2Yga3ZlYyBhbmQKKwkgKiBpb3ZlYyBhcmUgaWRlbnRpY2FsLCB5aWVsZGluZyB0aGUgc2FtZSBpbi1jb3JlIGxheW91dCBhbmQgYWxpZ25tZW50CisJICovCisJbXNnLT5tc2dfaW92ID0gKHN0cnVjdCBpb3ZlYyAqKXZlYzsKKwltc2ctPm1zZ19pb3ZsZW4gPSBudW07CisJcmVzdWx0ID0gc29ja19zZW5kbXNnKHNvY2ssIG1zZywgc2l6ZSk7CisJc2V0X2ZzKG9sZGZzKTsKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTChrZXJuZWxfc2VuZG1zZyk7CisKK3N0YXRpYyBpbnQga3RpbWUydHMoa3RpbWVfdCBrdCwgc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwlpZiAoa3QudHY2NCkgeworCQkqdHMgPSBrdGltZV90b190aW1lc3BlYyhrdCk7CisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCXJldHVybiAwOworCX0KK30KKworLyoKKyAqIGNhbGxlZCBmcm9tIHNvY2tfcmVjdl90aW1lc3RhbXAoKSBpZiBzb2NrX2ZsYWcoc2ssIFNPQ0tfUkNWVFNUQU1QKQorICovCit2b2lkIF9fc29ja19yZWN2X3RpbWVzdGFtcChzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzb2NrICpzaywKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBuZWVkX3NvZnR3YXJlX3RzdGFtcCA9IHNvY2tfZmxhZyhzaywgU09DS19SQ1ZUU1RBTVApOworCXN0cnVjdCB0aW1lc3BlYyB0c1szXTsKKwlpbnQgZW1wdHkgPSAxOworCXN0cnVjdCBza2Jfc2hhcmVkX2h3dHN0YW1wcyAqc2hod3RzdGFtcHMgPQorCQlza2JfaHd0c3RhbXBzKHNrYik7CisKKwkvKiBSYWNlIG9jY3VycmVkIGJldHdlZW4gdGltZXN0YW1wIGVuYWJsaW5nIGFuZCBwYWNrZXQKKwkgICByZWNlaXZpbmcuICBGaWxsIGluIHRoZSBjdXJyZW50IHRpbWUgZm9yIG5vdy4gKi8KKwlpZiAobmVlZF9zb2Z0d2FyZV90c3RhbXAgJiYgc2tiLT50c3RhbXAudHY2NCA9PSAwKQorCQlfX25ldF90aW1lc3RhbXAoc2tiKTsKKworCWlmIChuZWVkX3NvZnR3YXJlX3RzdGFtcCkgeworCQlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19SQ1ZUU1RBTVBOUykpIHsKKwkJCXN0cnVjdCB0aW1ldmFsIHR2OworCQkJc2tiX2dldF90aW1lc3RhbXAoc2tiLCAmdHYpOworCQkJcHV0X2Ntc2cobXNnLCBTT0xfU09DS0VULCBTQ01fVElNRVNUQU1QLAorCQkJCSBzaXplb2YodHYpLCAmdHYpOworCQl9IGVsc2UgeworCQkJc2tiX2dldF90aW1lc3RhbXBucyhza2IsICZ0c1swXSk7CisJCQlwdXRfY21zZyhtc2csIFNPTF9TT0NLRVQsIFNDTV9USU1FU1RBTVBOUywKKwkJCQkgc2l6ZW9mKHRzWzBdKSwgJnRzWzBdKTsKKwkJfQorCX0KKworCisJbWVtc2V0KHRzLCAwLCBzaXplb2YodHMpKTsKKwlpZiAoc2tiLT50c3RhbXAudHY2NCAmJgorCSAgICBzb2NrX2ZsYWcoc2ssIFNPQ0tfVElNRVNUQU1QSU5HX1NPRlRXQVJFKSkgeworCQlza2JfZ2V0X3RpbWVzdGFtcG5zKHNrYiwgdHMgKyAwKTsKKwkJZW1wdHkgPSAwOworCX0KKwlpZiAoc2hod3RzdGFtcHMpIHsKKwkJaWYgKHNvY2tfZmxhZyhzaywgU09DS19USU1FU1RBTVBJTkdfU1lTX0hBUkRXQVJFKSAmJgorCQkgICAga3RpbWUydHMoc2hod3RzdGFtcHMtPnN5c3RzdGFtcCwgdHMgKyAxKSkKKwkJCWVtcHR5ID0gMDsKKwkJaWYgKHNvY2tfZmxhZyhzaywgU09DS19USU1FU1RBTVBJTkdfUkFXX0hBUkRXQVJFKSAmJgorCQkgICAga3RpbWUydHMoc2hod3RzdGFtcHMtPmh3dHN0YW1wLCB0cyArIDIpKQorCQkJZW1wdHkgPSAwOworCX0KKwlpZiAoIWVtcHR5KQorCQlwdXRfY21zZyhtc2csIFNPTF9TT0NLRVQsCisJCQkgU0NNX1RJTUVTVEFNUElORywgc2l6ZW9mKHRzKSwgJnRzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fc29ja19yZWN2X3RpbWVzdGFtcCk7CisKK3ZvaWQgX19zb2NrX3JlY3Zfd2lmaV9zdGF0dXMoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc29jayAqc2ssCisJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgYWNrOworCisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfV0lGSV9TVEFUVVMpKQorCQlyZXR1cm47CisJaWYgKCFza2ItPndpZmlfYWNrZWRfdmFsaWQpCisJCXJldHVybjsKKworCWFjayA9IHNrYi0+d2lmaV9hY2tlZDsKKworCXB1dF9jbXNnKG1zZywgU09MX1NPQ0tFVCwgU0NNX1dJRklfU1RBVFVTLCBzaXplb2YoYWNrKSwgJmFjayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfX3NvY2tfcmVjdl93aWZpX3N0YXR1cyk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzb2NrX3JlY3ZfZHJvcHMoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAoc29ja19mbGFnKHNrLCBTT0NLX1JYUV9PVkZMKSAmJiBza2IgJiYgc2tiLT5kcm9wY291bnQpCisJCXB1dF9jbXNnKG1zZywgU09MX1NPQ0tFVCwgU09fUlhRX09WRkwsCisJCQlzaXplb2YoX191MzIpLCAmc2tiLT5kcm9wY291bnQpOworfQorCit2b2lkIF9fc29ja19yZWN2X3RzX2FuZF9kcm9wcyhzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzb2NrICpzaywKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNvY2tfcmVjdl90aW1lc3RhbXAobXNnLCBzaywgc2tiKTsKKwlzb2NrX3JlY3ZfZHJvcHMobXNnLCBzaywgc2tiKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fc29ja19yZWN2X3RzX2FuZF9kcm9wcyk7CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fc29ja19yZWN2bXNnX25vc2VjKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCQkgICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrX2lvY2IgKnNpID0ga2lvY2JfdG9fc2lvY2IoaW9jYik7CisKKwlzb2NrX3VwZGF0ZV9jbGFzc2lkKHNvY2stPnNrKTsKKworCXNpLT5zb2NrID0gc29jazsKKwlzaS0+c2NtID0gTlVMTDsKKwlzaS0+bXNnID0gbXNnOworCXNpLT5zaXplID0gc2l6ZTsKKwlzaS0+ZmxhZ3MgPSBmbGFnczsKKworCXJldHVybiBzb2NrLT5vcHMtPnJlY3Ztc2coaW9jYiwgc29jaywgbXNnLCBzaXplLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fc29ja19yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCQkgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCWludCBlcnIgPSBzZWN1cml0eV9zb2NrZXRfcmVjdm1zZyhzb2NrLCBtc2csIHNpemUsIGZsYWdzKTsKKworCXJldHVybiBlcnIgPzogX19zb2NrX3JlY3Ztc2dfbm9zZWMoaW9jYiwgc29jaywgbXNnLCBzaXplLCBmbGFncyk7Cit9CisKK2ludCBzb2NrX3JlY3Ztc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCQkgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qga2lvY2IgaW9jYjsKKwlzdHJ1Y3Qgc29ja19pb2NiIHNpb2NiOworCWludCByZXQ7CisKKwlpbml0X3N5bmNfa2lvY2IoJmlvY2IsIE5VTEwpOworCWlvY2IucHJpdmF0ZSA9ICZzaW9jYjsKKwlyZXQgPSBfX3NvY2tfcmVjdm1zZygmaW9jYiwgc29jaywgbXNnLCBzaXplLCBmbGFncyk7CisJaWYgKC1FSU9DQlFVRVVFRCA9PSByZXQpCisJCXJldCA9IHdhaXRfb25fc3luY19raW9jYigmaW9jYik7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woc29ja19yZWN2bXNnKTsKKworc3RhdGljIGludCBzb2NrX3JlY3Ztc2dfbm9zZWMoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCQkJICAgICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qga2lvY2IgaW9jYjsKKwlzdHJ1Y3Qgc29ja19pb2NiIHNpb2NiOworCWludCByZXQ7CisKKwlpbml0X3N5bmNfa2lvY2IoJmlvY2IsIE5VTEwpOworCWlvY2IucHJpdmF0ZSA9ICZzaW9jYjsKKwlyZXQgPSBfX3NvY2tfcmVjdm1zZ19ub3NlYygmaW9jYiwgc29jaywgbXNnLCBzaXplLCBmbGFncyk7CisJaWYgKC1FSU9DQlFVRVVFRCA9PSByZXQpCisJCXJldCA9IHdhaXRfb25fc3luY19raW9jYigmaW9jYik7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBrZXJuZWxfcmVjdm1zZyAtIFJlY2VpdmUgYSBtZXNzYWdlIGZyb20gYSBzb2NrZXQgKGtlcm5lbCBzcGFjZSkKKyAqIEBzb2NrOiAgICAgICBUaGUgc29ja2V0IHRvIHJlY2VpdmUgdGhlIG1lc3NhZ2UgZnJvbQorICogQG1zZzogICAgICAgIFJlY2VpdmVkIG1lc3NhZ2UKKyAqIEB2ZWM6ICAgICAgICBJbnB1dCBzL2cgYXJyYXkgZm9yIG1lc3NhZ2UgZGF0YQorICogQG51bTogICAgICAgIFNpemUgb2YgaW5wdXQgcy9nIGFycmF5CisgKiBAc2l6ZTogICAgICAgTnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqIEBmbGFnczogICAgICBNZXNzYWdlIGZsYWdzIChNU0dfRE9OVFdBSVQsIGV0Yy4uLikKKyAqCisgKiBPbiByZXR1cm4gdGhlIG1zZyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIHNjYXR0ZXIvZ2F0aGVyIGFycmF5IHBhc3NlZCBpbiB0aGUKKyAqIHZlYyBhcmd1bWVudC4gVGhlIGFycmF5IGlzIG1vZGlmaWVkIHNvIHRoYXQgaXQgY29uc2lzdHMgb2YgdGhlIHVuZmlsbGVkCisgKiBwb3J0aW9uIG9mIHRoZSBvcmlnaW5hbCBhcnJheS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCwgb3IgYW4gZXJyb3IuCisgKi8KK2ludCBrZXJuZWxfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCSAgIHN0cnVjdCBrdmVjICp2ZWMsIHNpemVfdCBudW0sIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJbW1fc2VnbWVudF90IG9sZGZzID0gZ2V0X2ZzKCk7CisJaW50IHJlc3VsdDsKKworCXNldF9mcyhLRVJORUxfRFMpOworCS8qCisJICogdGhlIGZvbGxvd2luZyBpcyBzYWZlLCBzaW5jZSBmb3IgY29tcGlsZXIgZGVmaW5pdGlvbnMgb2Yga3ZlYyBhbmQKKwkgKiBpb3ZlYyBhcmUgaWRlbnRpY2FsLCB5aWVsZGluZyB0aGUgc2FtZSBpbi1jb3JlIGxheW91dCBhbmQgYWxpZ25tZW50CisJICovCisJbXNnLT5tc2dfaW92ID0gKHN0cnVjdCBpb3ZlYyAqKXZlYywgbXNnLT5tc2dfaW92bGVuID0gbnVtOworCXJlc3VsdCA9IHNvY2tfcmVjdm1zZyhzb2NrLCBtc2csIHNpemUsIGZsYWdzKTsKKwlzZXRfZnMob2xkZnMpOworCXJldHVybiByZXN1bHQ7Cit9CitFWFBPUlRfU1lNQk9MKGtlcm5lbF9yZWN2bXNnKTsKKworc3RhdGljIHZvaWQgc29ja19haW9fZHRvcihzdHJ1Y3Qga2lvY2IgKmlvY2IpCit7CisJa2ZyZWUoaW9jYi0+cHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNvY2tfc2VuZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgICBpbnQgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgbG9mZl90ICpwcG9zLCBpbnQgbW9yZSkKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCWludCBmbGFnczsKKworCXNvY2sgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlmbGFncyA9IChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgPyBNU0dfRE9OVFdBSVQgOiAwOworCS8qIG1vcmUgaXMgYSBjb21iaW5hdGlvbiBvZiBNU0dfTU9SRSBhbmQgTVNHX1NFTkRQQUdFX05PVExBU1QgKi8KKwlmbGFncyB8PSBtb3JlOworCisJcmV0dXJuIGtlcm5lbF9zZW5kcGFnZShzb2NrLCBwYWdlLCBvZmZzZXQsIHNpemUsIGZsYWdzKTsKK30KKworc3RhdGljIHNzaXplX3Qgc29ja19zcGxpY2VfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90ICpwcG9zLAorCQkJCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsIHNpemVfdCBsZW4sCisJCQkJdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAodW5saWtlbHkoIXNvY2stPm9wcy0+c3BsaWNlX3JlYWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNvY2tfdXBkYXRlX2NsYXNzaWQoc29jay0+c2spOworCisJcmV0dXJuIHNvY2stPm9wcy0+c3BsaWNlX3JlYWQoc29jaywgcHBvcywgcGlwZSwgbGVuLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29ja19pb2NiICphbGxvY19zb2NrX2lvY2Ioc3RydWN0IGtpb2NiICppb2NiLAorCQkJCQkgc3RydWN0IHNvY2tfaW9jYiAqc2lvY2IpCit7CisJaWYgKCFpc19zeW5jX2tpb2NiKGlvY2IpKSB7CisJCXNpb2NiID0ga21hbGxvYyhzaXplb2YoKnNpb2NiKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghc2lvY2IpCisJCQlyZXR1cm4gTlVMTDsKKwkJaW9jYi0+a2lfZHRvciA9IHNvY2tfYWlvX2R0b3I7CisJfQorCisJc2lvY2ItPmtpb2NiID0gaW9jYjsKKwlpb2NiLT5wcml2YXRlID0gc2lvY2I7CisJcmV0dXJuIHNpb2NiOworfQorCitzdGF0aWMgc3NpemVfdCBkb19zb2NrX3JlYWQoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qga2lvY2IgKmlvY2IsCisJCXN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKKwkJdW5zaWduZWQgbG9uZyBucl9zZWdzKQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc2l6ZV90IHNpemUgPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yX3NlZ3M7IGkrKykKKwkJc2l6ZSArPSBpb3ZbaV0uaW92X2xlbjsKKworCW1zZy0+bXNnX25hbWUgPSBOVUxMOworCW1zZy0+bXNnX25hbWVsZW4gPSAwOworCW1zZy0+bXNnX2NvbnRyb2wgPSBOVUxMOworCW1zZy0+bXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy0+bXNnX2lvdiA9IChzdHJ1Y3QgaW92ZWMgKilpb3Y7CisJbXNnLT5tc2dfaW92bGVuID0gbnJfc2VnczsKKwltc2ctPm1zZ19mbGFncyA9IChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgPyBNU0dfRE9OVFdBSVQgOiAwOworCisJcmV0dXJuIF9fc29ja19yZWN2bXNnKGlvY2IsIHNvY2ssIG1zZywgc2l6ZSwgbXNnLT5tc2dfZmxhZ3MpOworfQorCitzdGF0aWMgc3NpemVfdCBzb2NrX2Fpb19yZWFkKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCisJCQkJdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBzb2NrX2lvY2Igc2lvY2IsICp4OworCisJaWYgKHBvcyAhPSAwKQorCQlyZXR1cm4gLUVTUElQRTsKKworCWlmIChpb2NiLT5raV9sZWZ0ID09IDApCS8qIE1hdGNoIFNZUzUgYmVoYXZpb3VyICovCisJCXJldHVybiAwOworCisKKwl4ID0gYWxsb2Nfc29ja19pb2NiKGlvY2IsICZzaW9jYik7CisJaWYgKCF4KQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gZG9fc29ja19yZWFkKCZ4LT5hc3luY19tc2csIGlvY2IsIGlvY2ItPmtpX2ZpbHAsIGlvdiwgbnJfc2Vncyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRvX3NvY2tfd3JpdGUoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qga2lvY2IgKmlvY2IsCisJCQlzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCisJCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCit7CisJc3RydWN0IHNvY2tldCAqc29jayA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzaXplX3Qgc2l6ZSA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfc2VnczsgaSsrKQorCQlzaXplICs9IGlvdltpXS5pb3ZfbGVuOworCisJbXNnLT5tc2dfbmFtZSA9IE5VTEw7CisJbXNnLT5tc2dfbmFtZWxlbiA9IDA7CisJbXNnLT5tc2dfY29udHJvbCA9IE5VTEw7CisJbXNnLT5tc2dfY29udHJvbGxlbiA9IDA7CisJbXNnLT5tc2dfaW92ID0gKHN0cnVjdCBpb3ZlYyAqKWlvdjsKKwltc2ctPm1zZ19pb3ZsZW4gPSBucl9zZWdzOworCW1zZy0+bXNnX2ZsYWdzID0gKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSA/IE1TR19ET05UV0FJVCA6IDA7CisJaWYgKHNvY2stPnR5cGUgPT0gU09DS19TRVFQQUNLRVQpCisJCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19FT1I7CisKKwlyZXR1cm4gX19zb2NrX3NlbmRtc2coaW9jYiwgc29jaywgbXNnLCBzaXplKTsKK30KKworc3RhdGljIHNzaXplX3Qgc29ja19haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKKwkJCSAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBzb2NrX2lvY2Igc2lvY2IsICp4OworCisJaWYgKHBvcyAhPSAwKQorCQlyZXR1cm4gLUVTUElQRTsKKworCXggPSBhbGxvY19zb2NrX2lvY2IoaW9jYiwgJnNpb2NiKTsKKwlpZiAoIXgpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIGRvX3NvY2tfd3JpdGUoJngtPmFzeW5jX21zZywgaW9jYiwgaW9jYi0+a2lfZmlscCwgaW92LCBucl9zZWdzKTsKK30KKworLyoKKyAqIEF0b21pYyBzZXR0aW5nIG9mIGlvY3RsIGhvb2tzIHRvIGF2b2lkIHJhY2UKKyAqIHdpdGggbW9kdWxlIHVubG9hZC4KKyAqLworCitzdGF0aWMgREVGSU5FX01VVEVYKGJyX2lvY3RsX211dGV4KTsKK3N0YXRpYyBpbnQgKCpicl9pb2N0bF9ob29rKSAoc3RydWN0IG5ldCAqLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKTsKKwordm9pZCBicmlvY3RsX3NldChpbnQgKCpob29rKSAoc3RydWN0IG5ldCAqLCB1bnNpZ25lZCBpbnQsIHZvaWQgX191c2VyICopKQoreworCW11dGV4X2xvY2soJmJyX2lvY3RsX211dGV4KTsKKwlicl9pb2N0bF9ob29rID0gaG9vazsKKwltdXRleF91bmxvY2soJmJyX2lvY3RsX211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0woYnJpb2N0bF9zZXQpOworCitzdGF0aWMgREVGSU5FX01VVEVYKHZsYW5faW9jdGxfbXV0ZXgpOworc3RhdGljIGludCAoKnZsYW5faW9jdGxfaG9vaykgKHN0cnVjdCBuZXQgKiwgdm9pZCBfX3VzZXIgKmFyZyk7CisKK3ZvaWQgdmxhbl9pb2N0bF9zZXQoaW50ICgqaG9vaykgKHN0cnVjdCBuZXQgKiwgdm9pZCBfX3VzZXIgKikpCit7CisJbXV0ZXhfbG9jaygmdmxhbl9pb2N0bF9tdXRleCk7CisJdmxhbl9pb2N0bF9ob29rID0gaG9vazsKKwltdXRleF91bmxvY2soJnZsYW5faW9jdGxfbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTCh2bGFuX2lvY3RsX3NldCk7CisKK3N0YXRpYyBERUZJTkVfTVVURVgoZGxjaV9pb2N0bF9tdXRleCk7CitzdGF0aWMgaW50ICgqZGxjaV9pb2N0bF9ob29rKSAodW5zaWduZWQgaW50LCB2b2lkIF9fdXNlciAqKTsKKwordm9pZCBkbGNpX2lvY3RsX3NldChpbnQgKCpob29rKSAodW5zaWduZWQgaW50LCB2b2lkIF9fdXNlciAqKSkKK3sKKwltdXRleF9sb2NrKCZkbGNpX2lvY3RsX211dGV4KTsKKwlkbGNpX2lvY3RsX2hvb2sgPSBob29rOworCW11dGV4X3VubG9jaygmZGxjaV9pb2N0bF9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MKGRsY2lfaW9jdGxfc2V0KTsKKworc3RhdGljIGxvbmcgc29ja19kb19pb2N0bChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBlcnI7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwllcnIgPSBzb2NrLT5vcHMtPmlvY3RsKHNvY2ssIGNtZCwgYXJnKTsKKworCS8qCisJICogSWYgdGhpcyBpb2N0bCBpcyB1bmtub3duIHRyeSB0byBoYW5kIGl0IGRvd24KKwkgKiB0byB0aGUgTklDIGRyaXZlci4KKwkgKi8KKwlpZiAoZXJyID09IC1FTk9JT0NUTENNRCkKKwkJZXJyID0gZGV2X2lvY3RsKG5ldCwgY21kLCBhcmdwKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKglXaXRoIGFuIGlvY3RsLCBhcmcgbWF5IHdlbGwgYmUgYSB1c2VyIG1vZGUgcG9pbnRlciwgYnV0IHdlIGRvbid0IGtub3cKKyAqCXdoYXQgdG8gZG8gd2l0aCBpdCAtIHRoYXQncyB1cCB0byB0aGUgcHJvdG9jb2wgc3RpbGwuCisgKi8KKworc3RhdGljIGxvbmcgc29ja19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCXN0cnVjdCBzb2NrICpzazsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgcGlkLCBlcnI7CisJc3RydWN0IG5ldCAqbmV0OworCisJc29jayA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzayA9IHNvY2stPnNrOworCW5ldCA9IHNvY2tfbmV0KHNrKTsKKwlpZiAoY21kID49IFNJT0NERVZQUklWQVRFICYmIGNtZCA8PSAoU0lPQ0RFVlBSSVZBVEUgKyAxNSkpIHsKKwkJZXJyID0gZGV2X2lvY3RsKG5ldCwgY21kLCBhcmdwKTsKKwl9IGVsc2UKKyNpZmRlZiBDT05GSUdfV0VYVF9DT1JFCisJaWYgKGNtZCA+PSBTSU9DSVdGSVJTVCAmJiBjbWQgPD0gU0lPQ0lXTEFTVCkgeworCQllcnIgPSBkZXZfaW9jdGwobmV0LCBjbWQsIGFyZ3ApOworCX0gZWxzZQorI2VuZGlmCisJCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgRklPU0VUT1dOOgorCQljYXNlIFNJT0NTUEdSUDoKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlpZiAoZ2V0X3VzZXIocGlkLCAoaW50IF9fdXNlciAqKWFyZ3ApKQorCQkJCWJyZWFrOworCQkJZXJyID0gZl9zZXRvd24oc29jay0+ZmlsZSwgcGlkLCAxKTsKKwkJCWJyZWFrOworCQljYXNlIEZJT0dFVE9XTjoKKwkJY2FzZSBTSU9DR1BHUlA6CisJCQllcnIgPSBwdXRfdXNlcihmX2dldG93bihzb2NrLT5maWxlKSwKKwkJCQkgICAgICAgKGludCBfX3VzZXIgKilhcmdwKTsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NHSUZCUjoKKwkJY2FzZSBTSU9DU0lGQlI6CisJCWNhc2UgU0lPQ0JSQUREQlI6CisJCWNhc2UgU0lPQ0JSREVMQlI6CisJCQllcnIgPSAtRU5PUEtHOworCQkJaWYgKCFicl9pb2N0bF9ob29rKQorCQkJCXJlcXVlc3RfbW9kdWxlKCJicmlkZ2UiKTsKKworCQkJbXV0ZXhfbG9jaygmYnJfaW9jdGxfbXV0ZXgpOworCQkJaWYgKGJyX2lvY3RsX2hvb2spCisJCQkJZXJyID0gYnJfaW9jdGxfaG9vayhuZXQsIGNtZCwgYXJncCk7CisJCQltdXRleF91bmxvY2soJmJyX2lvY3RsX211dGV4KTsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NHSUZWTEFOOgorCQljYXNlIFNJT0NTSUZWTEFOOgorCQkJZXJyID0gLUVOT1BLRzsKKwkJCWlmICghdmxhbl9pb2N0bF9ob29rKQorCQkJCXJlcXVlc3RfbW9kdWxlKCI4MDIxcSIpOworCisJCQltdXRleF9sb2NrKCZ2bGFuX2lvY3RsX211dGV4KTsKKwkJCWlmICh2bGFuX2lvY3RsX2hvb2spCisJCQkJZXJyID0gdmxhbl9pb2N0bF9ob29rKG5ldCwgYXJncCk7CisJCQltdXRleF91bmxvY2soJnZsYW5faW9jdGxfbXV0ZXgpOworCQkJYnJlYWs7CisJCWNhc2UgU0lPQ0FERERMQ0k6CisJCWNhc2UgU0lPQ0RFTERMQ0k6CisJCQllcnIgPSAtRU5PUEtHOworCQkJaWYgKCFkbGNpX2lvY3RsX2hvb2spCisJCQkJcmVxdWVzdF9tb2R1bGUoImRsY2kiKTsKKworCQkJbXV0ZXhfbG9jaygmZGxjaV9pb2N0bF9tdXRleCk7CisJCQlpZiAoZGxjaV9pb2N0bF9ob29rKQorCQkJCWVyciA9IGRsY2lfaW9jdGxfaG9vayhjbWQsIGFyZ3ApOworCQkJbXV0ZXhfdW5sb2NrKCZkbGNpX2lvY3RsX211dGV4KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyID0gc29ja19kb19pb2N0bChuZXQsIHNvY2ssIGNtZCwgYXJnKTsKKwkJCWJyZWFrOworCQl9CisJcmV0dXJuIGVycjsKK30KKworaW50IHNvY2tfY3JlYXRlX2xpdGUoaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBwcm90b2NvbCwgc3RydWN0IHNvY2tldCAqKnJlcykKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBOVUxMOworCisJZXJyID0gc2VjdXJpdHlfc29ja2V0X2NyZWF0ZShmYW1pbHksIHR5cGUsIHByb3RvY29sLCAxKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXNvY2sgPSBzb2NrX2FsbG9jKCk7CisJaWYgKCFzb2NrKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXNvY2stPnR5cGUgPSB0eXBlOworCWVyciA9IHNlY3VyaXR5X3NvY2tldF9wb3N0X2NyZWF0ZShzb2NrLCBmYW1pbHksIHR5cGUsIHByb3RvY29sLCAxKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9yZWxlYXNlOworCitvdXQ6CisJKnJlcyA9IHNvY2s7CisJcmV0dXJuIGVycjsKK291dF9yZWxlYXNlOgorCXNvY2tfcmVsZWFzZShzb2NrKTsKKwlzb2NrID0gTlVMTDsKKwlnb3RvIG91dDsKK30KK0VYUE9SVF9TWU1CT0woc29ja19jcmVhdGVfbGl0ZSk7CisKKy8qIE5vIGtlcm5lbCBsb2NrIGhlbGQgLSBwZXJmZWN0ICovCitzdGF0aWMgdW5zaWduZWQgaW50IHNvY2tfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCisJLyoKKwkgKiAgICAgIFdlIGNhbid0IHJldHVybiBlcnJvcnMgdG8gcG9sbCwgc28gaXQncyBlaXRoZXIgeWVzIG9yIG5vLgorCSAqLworCXNvY2sgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJcmV0dXJuIHNvY2stPm9wcy0+cG9sbChmaWxlLCBzb2NrLCB3YWl0KTsKK30KKworc3RhdGljIGludCBzb2NrX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlyZXR1cm4gc29jay0+b3BzLT5tbWFwKGZpbGUsIHNvY2ssIHZtYSk7Cit9CisKK3N0YXRpYyBpbnQgc29ja19jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwkvKgorCSAqICAgICAgSXQgd2FzIHBvc3NpYmxlIHRoZSBpbm9kZSBpcyBOVUxMIHdlIHdlcmUKKwkgKiAgICAgIGNsb3NpbmcgYW4gdW5maW5pc2hlZCBzb2NrZXQuCisJICovCisKKwlpZiAoIWlub2RlKSB7CisJCXByaW50X3N1bihTVU5fREJHLCJzb2NrX2Nsb3NlOiBOVUxMIGlub2RlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXNvY2tfcmVsZWFzZShTT0NLRVRfSShpbm9kZSkpOworCXJldHVybiAwOworfQorCisvKgorICoJVXBkYXRlIHRoZSBzb2NrZXQgYXN5bmMgbGlzdAorICoKKyAqCUZhc3luY19saXN0IGxvY2tpbmcgc3RyYXRlZ3kuCisgKgorICoJMS4gZmFzeW5jX2xpc3QgaXMgbW9kaWZpZWQgb25seSB1bmRlciBwcm9jZXNzIGNvbnRleHQgc29ja2V0IGxvY2sKKyAqCSAgIGkuZS4gdW5kZXIgc2VtYXBob3JlLgorICoJMi4gZmFzeW5jX2xpc3QgaXMgdXNlZCB1bmRlciByZWFkX2xvY2soJnNrLT5za19jYWxsYmFja19sb2NrKQorICoJICAgb3IgdW5kZXIgc29ja2V0IGxvY2sKKyAqLworCitzdGF0aWMgaW50IHNvY2tfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBvbikKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBzb2NrZXRfd3EgKndxOworCisJaWYgKHNrID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJbG9ja19zb2NrKHNrKTsKKwl3cSA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoc29jay0+d3EsIHNvY2tfb3duZWRfYnlfdXNlcihzaykpOworCWZhc3luY19oZWxwZXIoZmQsIGZpbHAsIG9uLCAmd3EtPmZhc3luY19saXN0KTsKKworCWlmICghd3EtPmZhc3luY19saXN0KQorCQlzb2NrX3Jlc2V0X2ZsYWcoc2ssIFNPQ0tfRkFTWU5DKTsKKwllbHNlCisJCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfRkFTWU5DKTsKKworCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBvbmx5IHVuZGVyIHNvY2tldCBsb2NrIG9yIGNhbGxiYWNrX2xvY2sgb3IgcmN1X2xvY2sgKi8KKworaW50IHNvY2tfd2FrZV9hc3luYyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgaG93LCBpbnQgYmFuZCkKK3sKKwlzdHJ1Y3Qgc29ja2V0X3dxICp3cTsKKworCWlmICghc29jaykKKwkJcmV0dXJuIC0xOworCXJjdV9yZWFkX2xvY2soKTsKKwl3cSA9IHJjdV9kZXJlZmVyZW5jZShzb2NrLT53cSk7CisJaWYgKCF3cSB8fCAhd3EtPmZhc3luY19saXN0KSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm4gLTE7CisJfQorCXN3aXRjaCAoaG93KSB7CisJY2FzZSBTT0NLX1dBS0VfV0FJVEQ6CisJCWlmICh0ZXN0X2JpdChTT0NLX0FTWU5DX1dBSVREQVRBLCAmc29jay0+ZmxhZ3MpKQorCQkJYnJlYWs7CisJCWdvdG8gY2FsbF9raWxsOworCWNhc2UgU09DS19XQUtFX1NQQUNFOgorCQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChTT0NLX0FTWU5DX05PU1BBQ0UsICZzb2NrLT5mbGFncykpCisJCQlicmVhazsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBTT0NLX1dBS0VfSU86CitjYWxsX2tpbGw6CisJCWtpbGxfZmFzeW5jKCZ3cS0+ZmFzeW5jX2xpc3QsIFNJR0lPLCBiYW5kKTsKKwkJYnJlYWs7CisJY2FzZSBTT0NLX1dBS0VfVVJHOgorCQlraWxsX2Zhc3luYygmd3EtPmZhc3luY19saXN0LCBTSUdVUkcsIGJhbmQpOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woc29ja193YWtlX2FzeW5jKTsKKworaW50IF9fc29ja19jcmVhdGUoc3RydWN0IG5ldCAqbmV0LCBpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvY29sLAorCQkJIHN0cnVjdCBzb2NrZXQgKipyZXMsIGludCBrZXJuKQoreworCWludCBlcnI7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwljb25zdCBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseSAqcGY7CisKKwkvKgorCSAqICAgICAgQ2hlY2sgcHJvdG9jb2wgaXMgaW4gcmFuZ2UKKwkgKi8KKwlpZiAoZmFtaWx5IDwgMCB8fCBmYW1pbHkgPj0gTlBST1RPKQorCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKKwlpZiAodHlwZSA8IDAgfHwgdHlwZSA+PSBTT0NLX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBDb21wYXRpYmlsaXR5LgorCisJICAgVGhpcyB1Z2x5bW9yb24gaXMgbW92ZWQgZnJvbSBJTkVUIGxheWVyIHRvIGhlcmUgdG8gYXZvaWQKKwkgICBkZWFkbG9jayBpbiBtb2R1bGUgbG9hZC4KKwkgKi8KKwlpZiAoZmFtaWx5ID09IFBGX0lORVQgJiYgdHlwZSA9PSBTT0NLX1BBQ0tFVCkgeworCQlzdGF0aWMgaW50IHdhcm5lZDsKKwkJaWYgKCF3YXJuZWQpIHsKKwkJCXdhcm5lZCA9IDE7CisJCQlwcmludF9zdW4oU1VOX0RCRywiJXMgdXNlcyBvYnNvbGV0ZSAoUEZfSU5FVCxTT0NLX1BBQ0tFVClcbiIsCisJCQkgICAgICAgY3VycmVudC0+Y29tbSk7CisJCX0KKwkJZmFtaWx5ID0gUEZfUEFDS0VUOworCX0KKworCWVyciA9IHNlY3VyaXR5X3NvY2tldF9jcmVhdGUoZmFtaWx5LCB0eXBlLCBwcm90b2NvbCwga2Vybik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qCisJICoJQWxsb2NhdGUgdGhlIHNvY2tldCBhbmQgYWxsb3cgdGhlIGZhbWlseSB0byBzZXQgdGhpbmdzIHVwLiBpZgorCSAqCXRoZSBwcm90b2NvbCBpcyAwLCB0aGUgZmFtaWx5IGlzIGluc3RydWN0ZWQgdG8gc2VsZWN0IGFuIGFwcHJvcHJpYXRlCisJICoJZGVmYXVsdC4KKwkgKi8KKwlzb2NrID0gc29ja19hbGxvYygpOworCWlmICghc29jaykgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRfc3VuKFNVTl9EQkcsInNvY2tldDogbm8gbW9yZSBzb2NrZXRzXG4iKTsKKwkJcmV0dXJuIC1FTkZJTEU7CS8qIE5vdCBleGFjdGx5IGEgbWF0Y2gsIGJ1dCBpdHMgdGhlCisJCQkJICAgY2xvc2VzdCBwb3NpeCB0aGluZyAqLworCX0KKworCXNvY2stPnR5cGUgPSB0eXBlOworCisjaWZkZWYgQ09ORklHX01PRFVMRVMKKwkvKiBBdHRlbXB0IHRvIGxvYWQgYSBwcm90b2NvbCBtb2R1bGUgaWYgdGhlIGZpbmQgZmFpbGVkLgorCSAqCisJICogMTIvMDkvMTk5NiBNYXJjaW46IEJ1dCEgdGhpcyBtYWtlcyBSRUFMTFkgb25seSBzZW5zZSwgaWYgdGhlIHVzZXIKKwkgKiByZXF1ZXN0ZWQgcmVhbCwgZnVsbC1mZWF0dXJlZCBuZXR3b3JraW5nIHN1cHBvcnQgdXBvbiBjb25maWd1cmF0aW9uLgorCSAqIE90aGVyd2lzZSBtb2R1bGUgc3VwcG9ydCB3aWxsIGJyZWFrIQorCSAqLworCWlmIChyY3VfYWNjZXNzX3BvaW50ZXIobmV0X2ZhbWlsaWVzW2ZhbWlseV0pID09IE5VTEwpCisJCXJlcXVlc3RfbW9kdWxlKCJuZXQtcGYtJWQiLCBmYW1pbHkpOworI2VuZGlmCisKKwlyY3VfcmVhZF9sb2NrKCk7CisJcGYgPSByY3VfZGVyZWZlcmVuY2UobmV0X2ZhbWlsaWVzW2ZhbWlseV0pOworCWVyciA9IC1FQUZOT1NVUFBPUlQ7CisJaWYgKCFwZikKKwkJZ290byBvdXRfcmVsZWFzZTsKKworCS8qCisJICogV2Ugd2lsbCBjYWxsIHRoZSAtPmNyZWF0ZSBmdW5jdGlvbiwgdGhhdCBwb3NzaWJseSBpcyBpbiBhIGxvYWRhYmxlCisJICogbW9kdWxlLCBzbyB3ZSBoYXZlIHRvIGJ1bXAgdGhhdCBsb2FkYWJsZSBtb2R1bGUgcmVmY250IGZpcnN0LgorCSAqLworCWlmICghdHJ5X21vZHVsZV9nZXQocGYtPm93bmVyKSkKKwkJZ290byBvdXRfcmVsZWFzZTsKKworCS8qIE5vdyBwcm90ZWN0ZWQgYnkgbW9kdWxlIHJlZiBjb3VudCAqLworCXJjdV9yZWFkX3VubG9jaygpOworCisJZXJyID0gcGYtPmNyZWF0ZShuZXQsIHNvY2ssIHByb3RvY29sLCBrZXJuKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXRfbW9kdWxlX3B1dDsKKworCS8qCisJICogTm93IHRvIGJ1bXAgdGhlIHJlZmNudCBvZiB0aGUgW2xvYWRhYmxlXSBtb2R1bGUgdGhhdCBvd25zIHRoaXMKKwkgKiBzb2NrZXQgYXQgc29ja19yZWxlYXNlIHRpbWUgd2UgZGVjcmVtZW50IGl0cyByZWZjbnQuCisJICovCisJaWYgKCF0cnlfbW9kdWxlX2dldChzb2NrLT5vcHMtPm93bmVyKSkKKwkJZ290byBvdXRfbW9kdWxlX2J1c3k7CisKKwkvKgorCSAqIE5vdyB0aGF0IHdlJ3JlIGRvbmUgd2l0aCB0aGUgLT5jcmVhdGUgZnVuY3Rpb24sIHRoZSBbbG9hZGFibGVdCisJICogbW9kdWxlIGNhbiBoYXZlIGl0cyByZWZjbnQgZGVjcmVtZW50ZWQKKwkgKi8KKwltb2R1bGVfcHV0KHBmLT5vd25lcik7CisJZXJyID0gc2VjdXJpdHlfc29ja2V0X3Bvc3RfY3JlYXRlKHNvY2ssIGZhbWlseSwgdHlwZSwgcHJvdG9jb2wsIGtlcm4pOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3NvY2tfcmVsZWFzZTsKKwkqcmVzID0gc29jazsKKworCXJldHVybiAwOworCitvdXRfbW9kdWxlX2J1c3k6CisJZXJyID0gLUVBRk5PU1VQUE9SVDsKK291dF9tb2R1bGVfcHV0OgorCXNvY2stPm9wcyA9IE5VTEw7CisJbW9kdWxlX3B1dChwZi0+b3duZXIpOworb3V0X3NvY2tfcmVsZWFzZToKKwlzb2NrX3JlbGVhc2Uoc29jayk7CisJcmV0dXJuIGVycjsKKworb3V0X3JlbGVhc2U6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJZ290byBvdXRfc29ja19yZWxlYXNlOworfQorRVhQT1JUX1NZTUJPTChfX3NvY2tfY3JlYXRlKTsKKworaW50IHNvY2tfY3JlYXRlKGludCBmYW1pbHksIGludCB0eXBlLCBpbnQgcHJvdG9jb2wsIHN0cnVjdCBzb2NrZXQgKipyZXMpCit7CisJcmV0dXJuIF9fc29ja19jcmVhdGUoY3VycmVudC0+bnNwcm94eS0+bmV0X25zLCBmYW1pbHksIHR5cGUsIHByb3RvY29sLCByZXMsIDApOworfQorRVhQT1JUX1NZTUJPTChzb2NrX2NyZWF0ZSk7CisKK2ludCBzb2NrX2NyZWF0ZV9rZXJuKGludCBmYW1pbHksIGludCB0eXBlLCBpbnQgcHJvdG9jb2wsIHN0cnVjdCBzb2NrZXQgKipyZXMpCit7CisJcmV0dXJuIF9fc29ja19jcmVhdGUoJmluaXRfbmV0LCBmYW1pbHksIHR5cGUsIHByb3RvY29sLCByZXMsIDEpOworfQorRVhQT1JUX1NZTUJPTChzb2NrX2NyZWF0ZV9rZXJuKTsKKworU1lTQ0FMTF9ERUZJTkUzKHNvY2tldCwgaW50LCBmYW1pbHksIGludCwgdHlwZSwgaW50LCBwcm90b2NvbCkKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisJaW50IGZsYWdzOworCisJLyogQ2hlY2sgdGhlIFNPQ0tfKiBjb25zdGFudHMgZm9yIGNvbnNpc3RlbmN5LiAgKi8KKwlCVUlMRF9CVUdfT04oU09DS19DTE9FWEVDICE9IE9fQ0xPRVhFQyk7CisJQlVJTERfQlVHX09OKChTT0NLX01BWCB8IFNPQ0tfVFlQRV9NQVNLKSAhPSBTT0NLX1RZUEVfTUFTSyk7CisJQlVJTERfQlVHX09OKFNPQ0tfQ0xPRVhFQyAmIFNPQ0tfVFlQRV9NQVNLKTsKKwlCVUlMRF9CVUdfT04oU09DS19OT05CTE9DSyAmIFNPQ0tfVFlQRV9NQVNLKTsKKworCWZsYWdzID0gdHlwZSAmIH5TT0NLX1RZUEVfTUFTSzsKKwlpZiAoZmxhZ3MgJiB+KFNPQ0tfQ0xPRVhFQyB8IFNPQ0tfTk9OQkxPQ0spKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl0eXBlICY9IFNPQ0tfVFlQRV9NQVNLOworCisJaWYgKFNPQ0tfTk9OQkxPQ0sgIT0gT19OT05CTE9DSyAmJiAoZmxhZ3MgJiBTT0NLX05PTkJMT0NLKSkKKwkJZmxhZ3MgPSAoZmxhZ3MgJiB+U09DS19OT05CTE9DSykgfCBPX05PTkJMT0NLOworCisJcmV0dmFsID0gc29ja19jcmVhdGUoZmFtaWx5LCB0eXBlLCBwcm90b2NvbCwgJnNvY2spOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIG91dDsKKworCXJldHZhbCA9IHNvY2tfbWFwX2ZkKHNvY2ssIGZsYWdzICYgKE9fQ0xPRVhFQyB8IE9fTk9OQkxPQ0spKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBvdXRfcmVsZWFzZTsKKworb3V0OgorCS8qIEl0IG1heSBiZSBhbHJlYWR5IGFub3RoZXIgZGVzY3JpcHRvciA4KSBOb3Qga2VybmVsIHByb2JsZW0uICovCisJcmV0dXJuIHJldHZhbDsKKworb3V0X3JlbGVhc2U6CisJc29ja19yZWxlYXNlKHNvY2spOworCXJldHVybiByZXR2YWw7Cit9CitFWFBPUlRfU1lNQk9MKHN5c19zb2NrZXQpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3N0YXRpYyBpbnQgbXljb3B5X21zZ2hkcl9mcm9tX3VzZXIoc3RydWN0IG1zZ2hkciAqa21zZywKKwkJCQkgc3RydWN0IG1zZ2hkciBfX3VzZXIgKnVtc2cpCit7CisJbWVtY3B5KGttc2csIHVtc2csIHNpemVvZihzdHJ1Y3QgbXNnaGRyKSk7CisKKwlpZiAoa21zZy0+bXNnX25hbWUgPT0gTlVMTCkKKwkJa21zZy0+bXNnX25hbWVsZW4gPSAwOworCisJaWYgKGttc2ctPm1zZ19uYW1lbGVuIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoa21zZy0+bXNnX25hbWVsZW4gPiBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpKQorCQlrbXNnLT5tc2dfbmFtZWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSk7CisJcmV0dXJuIDA7Cit9CisKK1NZU0NBTExfREVGSU5FNChteXNvY2tldHBhaXIsIGludCwgZmFtaWx5LCBpbnQsIHR5cGUsIGludCwgcHJvdG9jb2wsCisJCWludCBfX3VzZXIgKiwgdXNvY2t2ZWMpCit7CisJc3RydWN0IHNvY2tldCAqc29jazEsICpzb2NrMjsKKwlpbnQgZmQxLCBmZDIsIGVycjsKKwlzdHJ1Y3QgZmlsZSAqbmV3ZmlsZTEsICpuZXdmaWxlMjsKKwlpbnQgZmxhZ3M7CisKKwlmbGFncyA9IHR5cGUgJiB+U09DS19UWVBFX01BU0s7CisJaWYgKGZsYWdzICYgfihTT0NLX0NMT0VYRUMgfCBTT0NLX05PTkJMT0NLKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdHlwZSAmPSBTT0NLX1RZUEVfTUFTSzsKKworCWlmIChTT0NLX05PTkJMT0NLICE9IE9fTk9OQkxPQ0sgJiYgKGZsYWdzICYgU09DS19OT05CTE9DSykpCisJCWZsYWdzID0gKGZsYWdzICYgflNPQ0tfTk9OQkxPQ0spIHwgT19OT05CTE9DSzsKKworCS8qCisJICogT2J0YWluIHRoZSBmaXJzdCBzb2NrZXQgYW5kIGNoZWNrIGlmIHRoZSB1bmRlcmx5aW5nIHByb3RvY29sCisJICogc3VwcG9ydHMgdGhlIHNvY2tldHBhaXIgY2FsbC4KKwkgKi8KKworCWVyciA9IHNvY2tfY3JlYXRlKGZhbWlseSwgdHlwZSwgcHJvdG9jb2wsICZzb2NrMSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0OworCisJZXJyID0gc29ja19jcmVhdGUoZmFtaWx5LCB0eXBlLCBwcm90b2NvbCwgJnNvY2syKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXRfcmVsZWFzZV8xOworCisJZXJyID0gc29jazEtPm9wcy0+c29ja2V0cGFpcihzb2NrMSwgc29jazIpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9yZWxlYXNlX2JvdGg7CisKKwlmZDEgPSBzb2NrX2FsbG9jX2ZpbGUoc29jazEsICZuZXdmaWxlMSwgZmxhZ3MpOworCWlmICh1bmxpa2VseShmZDEgPCAwKSkgeworCQllcnIgPSBmZDE7CisJCWdvdG8gb3V0X3JlbGVhc2VfYm90aDsKKwl9CisKKwlmZDIgPSBzb2NrX2FsbG9jX2ZpbGUoc29jazIsICZuZXdmaWxlMiwgZmxhZ3MpOworCWlmICh1bmxpa2VseShmZDIgPCAwKSkgeworCQllcnIgPSBmZDI7CisJCWZwdXQobmV3ZmlsZTEpOworCQlwdXRfdW51c2VkX2ZkKGZkMSk7CisJCXNvY2tfcmVsZWFzZShzb2NrMik7CisJCWdvdG8gb3V0OworCX0KKworCWF1ZGl0X2ZkX3BhaXIoZmQxLCBmZDIpOworCWZkX2luc3RhbGwoZmQxLCBuZXdmaWxlMSk7CisJZmRfaW5zdGFsbChmZDIsIG5ld2ZpbGUyKTsKKwkvKiBmZDEgYW5kIGZkMiBtYXkgYmUgYWxyZWFkeSBhbm90aGVyIGRlc2NyaXB0b3JzLgorCSAqIE5vdCBrZXJuZWwgcHJvYmxlbS4KKwkgKi8KKworCWVyciA9IG15cHV0X3VzZXIoZmQxLCAmdXNvY2t2ZWNbMF0pOworCWlmICghZXJyKQorCQllcnIgPSBteXB1dF91c2VyKGZkMiwgJnVzb2NrdmVjWzFdKTsKKwlpZiAoIWVycikKKwkJcmV0dXJuIDA7CisKKwlzeXNfY2xvc2UoZmQyKTsKKwlzeXNfY2xvc2UoZmQxKTsKKwlyZXR1cm4gZXJyOworCitvdXRfcmVsZWFzZV9ib3RoOgorCXNvY2tfcmVsZWFzZShzb2NrMik7CitvdXRfcmVsZWFzZV8xOgorCXNvY2tfcmVsZWFzZShzb2NrMSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworCisKK3N0YXRpYyBpbnQgX19fc3lzX215cmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyIF9fdXNlciAqbXNnLAorCQkJICBzdHJ1Y3QgbXNnaGRyICptc2dfc3lzLCB1bnNpZ25lZCBmbGFncywgaW50IG5vc2VjKQoreworCXN0cnVjdCBjb21wYXRfbXNnaGRyIF9fdXNlciAqbXNnX2NvbXBhdCA9CisJICAgIChzdHJ1Y3QgY29tcGF0X21zZ2hkciBfX3VzZXIgKiltc2c7CisJc3RydWN0IGlvdmVjIGlvdnN0YWNrW1VJT19GQVNUSU9WXTsKKwlzdHJ1Y3QgaW92ZWMgKmlvdiA9IGlvdnN0YWNrOworCXVuc2lnbmVkIGxvbmcgY21zZ19wdHI7CisJaW50IGVyciwgaW92X3NpemUsIHRvdGFsX2xlbiwgbGVuOworCisJLyoga2VybmVsIG1vZGUgYWRkcmVzcyAqLworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7CisKKwkvKiB1c2VyIG1vZGUgYWRkcmVzcyBwb2ludGVycyAqLworCXN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKnVhZGRyOworCWludCBfX3VzZXIgKnVhZGRyX2xlbjsKKworCWlmIChNU0dfQ01TR19DT01QQVQgJiBmbGFncykKKwkJZXJyID0gZ2V0X2NvbXBhdF9tc2doZHIobXNnX3N5cywgbXNnX2NvbXBhdCk7CisJZWxzZQorCQllcnIgPSBteWNvcHlfbXNnaGRyX2Zyb21fdXNlcihtc2dfc3lzLCBtc2cpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSAtRU1TR1NJWkU7CisJaWYgKG1zZ19zeXMtPm1zZ19pb3ZsZW4gPiBVSU9fTUFYSU9WKQorCQlnb3RvIG91dDsKKworCS8qIENoZWNrIHdoZXRoZXIgdG8gYWxsb2NhdGUgdGhlIGlvdmVjIGFyZWEgKi8KKwllcnIgPSAtRU5PTUVNOworCWlvdl9zaXplID0gbXNnX3N5cy0+bXNnX2lvdmxlbiAqIHNpemVvZihzdHJ1Y3QgaW92ZWMpOworCWlmIChtc2dfc3lzLT5tc2dfaW92bGVuID4gVUlPX0ZBU1RJT1YpIHsKKwkJaW92ID0gc29ja19rbWFsbG9jKHNvY2stPnNrLCBpb3Zfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaW92KQorCQkJZ290byBvdXQ7CisJfQorCisJLyogU2F2ZSB0aGUgdXNlci1tb2RlIGFkZHJlc3MgKHZlcmlmeV9pb3ZlYyB3aWxsIGNoYW5nZSB0aGUKKwkgKiBrZXJuZWwgbXNnaGRyIHRvIHVzZSB0aGUga2VybmVsIGFkZHJlc3Mgc3BhY2UpCisJICovCisJdWFkZHIgPSAoX19mb3JjZSB2b2lkIF9fdXNlciAqKW1zZ19zeXMtPm1zZ19uYW1lOworCXVhZGRyX2xlbiA9IENPTVBBVF9OQU1FTEVOKG1zZyk7CisJaWYgKE1TR19DTVNHX0NPTVBBVCAmIGZsYWdzKQorCQllcnIgPSB2ZXJpZnlfY29tcGF0X2lvdmVjKG1zZ19zeXMsIGlvdiwgJmFkZHIsIFZFUklGWV9XUklURSk7CisJZWxzZQorCQllcnIgPSB2ZXJpZnlfaW92ZWMobXNnX3N5cywgaW92LCAmYWRkciwgVkVSSUZZX1dSSVRFKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXRfZnJlZWlvdjsKKwl0b3RhbF9sZW4gPSBlcnI7CisKKwljbXNnX3B0ciA9ICh1bnNpZ25lZCBsb25nKW1zZ19zeXMtPm1zZ19jb250cm9sOworCW1zZ19zeXMtPm1zZ19mbGFncyA9IGZsYWdzICYgKE1TR19DTVNHX0NMT0VYRUN8TVNHX0NNU0dfQ09NUEFUKTsKKworCS8qIFdlIGFzc3VtZSBhbGwga2VybmVsIGNvZGUga25vd3MgdGhlIHNpemUgb2Ygc29ja2FkZHJfc3RvcmFnZSAqLworCW1zZ19zeXMtPm1zZ19uYW1lbGVuID0gMDsKKworCWlmIChzb2NrLT5maWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJZmxhZ3MgfD0gTVNHX0RPTlRXQUlUOworCWVyciA9IChub3NlYyA/IHNvY2tfcmVjdm1zZ19ub3NlYyA6IHNvY2tfcmVjdm1zZykoc29jaywgbXNnX3N5cywKKwkJCQkJCQkgIHRvdGFsX2xlbiwgZmxhZ3MpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9mcmVlaW92OworCWxlbiA9IGVycjsKKworCWlmICh1YWRkciAhPSBOVUxMKSB7CisJCWVyciA9IG15bW92ZV9hZGRyX3RvX3VzZXIoJmFkZHIsCisJCQkJCW1zZ19zeXMtPm1zZ19uYW1lbGVuLCB1YWRkciwKKwkJCQkJdWFkZHJfbGVuKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG91dF9mcmVlaW92OworCX0KKwllcnIgPSBteXB1dF91c2VyKChtc2dfc3lzLT5tc2dfZmxhZ3MgJiB+TVNHX0NNU0dfQ09NUEFUKSwKKwkJCSBDT01QQVRfRkxBR1MobXNnKSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZWlvdjsKKwlpZiAoTVNHX0NNU0dfQ09NUEFUICYgZmxhZ3MpCisJCWVyciA9IG15cHV0X3VzZXIoKHVuc2lnbmVkIGxvbmcpbXNnX3N5cy0+bXNnX2NvbnRyb2wgLSBjbXNnX3B0ciwKKwkJCQkgJm1zZ19jb21wYXQtPm1zZ19jb250cm9sbGVuKTsKKwllbHNlCisJCWVyciA9IG15cHV0X3VzZXIoKHVuc2lnbmVkIGxvbmcpbXNnX3N5cy0+bXNnX2NvbnRyb2wgLSBjbXNnX3B0ciwKKwkJCQkgJm1zZy0+bXNnX2NvbnRyb2xsZW4pOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWVpb3Y7CisJZXJyID0gbGVuOworCitvdXRfZnJlZWlvdjoKKwlpZiAoaW92ICE9IGlvdnN0YWNrKQorCQlzb2NrX2tmcmVlX3Moc29jay0+c2ssIGlvdiwgaW92X3NpemUpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK2xvbmcgX19zeXNfbXlyZWN2bXNnKGludCBmZCwgc3RydWN0IG1zZ2hkciBfX3VzZXIgKm1zZywgdW5zaWduZWQgZmxhZ3MpCit7CisJaW50IGZwdXRfbmVlZGVkLCBlcnI7CisJc3RydWN0IG1zZ2hkciBtc2dfc3lzOworCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisKKwlzb2NrID0gc29ja2ZkX2xvb2t1cF9saWdodChmZCwgJmVyciwgJmZwdXRfbmVlZGVkKTsKKwlpZiAoIXNvY2spCisJCWdvdG8gb3V0OworCisJZXJyID0gX19fc3lzX215cmVjdm1zZyhzb2NrLCBtc2csICZtc2dfc3lzLCBmbGFncywgMCk7CisKKwlmcHV0X2xpZ2h0KHNvY2stPmZpbGUsIGZwdXRfbmVlZGVkKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitTWVNDQUxMX0RFRklORTMobXlyZWN2bXNnLCBpbnQsIGZkLCBzdHJ1Y3QgbXNnaGRyIF9fdXNlciAqLCBtc2csCisJCXVuc2lnbmVkIGludCwgZmxhZ3MpCit7CisJaWYgKGZsYWdzICYgTVNHX0NNU0dfQ09NUEFUKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gX19zeXNfbXlyZWN2bXNnKGZkLCBtc2csIGZsYWdzKTsKK30KKworCisKK2ludCBfX3N5c19teXJlY3ZtbXNnKGludCBmZCwgc3RydWN0IG1tc2doZHIgX191c2VyICptbXNnLCB1bnNpZ25lZCBpbnQgdmxlbiwKKwkJICAgdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVvdXQpCit7CisJaW50IGZwdXRfbmVlZGVkLCBlcnIsIGRhdGFncmFtczsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCXN0cnVjdCBtbXNnaGRyIF9fdXNlciAqZW50cnk7CisJc3RydWN0IGNvbXBhdF9tbXNnaGRyIF9fdXNlciAqY29tcGF0X2VudHJ5OworCXN0cnVjdCBtc2doZHIgbXNnX3N5czsKKwlzdHJ1Y3QgdGltZXNwZWMgZW5kX3RpbWU7CisKKwlpZiAodGltZW91dCAmJgorCSAgICBwb2xsX3NlbGVjdF9zZXRfdGltZW91dCgmZW5kX3RpbWUsIHRpbWVvdXQtPnR2X3NlYywKKwkJCQkgICAgdGltZW91dC0+dHZfbnNlYykpCisJCXJldHVybiAtRUlOVkFMOworCisJZGF0YWdyYW1zID0gMDsKKworCXNvY2sgPSBzb2NrZmRfbG9va3VwX2xpZ2h0KGZkLCAmZXJyLCAmZnB1dF9uZWVkZWQpOworCWlmICghc29jaykKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHNvY2tfZXJyb3Ioc29jay0+c2spOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3B1dDsKKworCWVudHJ5ID0gbW1zZzsKKwljb21wYXRfZW50cnkgPSAoc3RydWN0IGNvbXBhdF9tbXNnaGRyIF9fdXNlciAqKW1tc2c7CisKKwl3aGlsZSAoZGF0YWdyYW1zIDwgdmxlbikgeworCQkvKgorCQkgKiBObyBuZWVkIHRvIGFzayBMU00gZm9yIG1vcmUgdGhhbiB0aGUgZmlyc3QgZGF0YWdyYW0uCisJCSAqLworCQlpZiAoTVNHX0NNU0dfQ09NUEFUICYgZmxhZ3MpIHsKKwkJCWVyciA9IF9fX3N5c19teXJlY3Ztc2coc29jaywgKHN0cnVjdCBtc2doZHIgX191c2VyICopY29tcGF0X2VudHJ5LAorCQkJCQkgICAgICZtc2dfc3lzLCBmbGFncyAmIH5NU0dfV0FJVEZPUk9ORSwKKwkJCQkJICAgICBkYXRhZ3JhbXMpOworCQkJaWYgKGVyciA8IDApCisJCQkJYnJlYWs7CisJCQllcnIgPSBteXB1dF91c2VyKGVyciwgJmNvbXBhdF9lbnRyeS0+bXNnX2xlbik7CisJCQkrK2NvbXBhdF9lbnRyeTsKKwkJfSBlbHNlIHsKKwkJCWVyciA9IF9fX3N5c19teXJlY3Ztc2coc29jaywKKwkJCQkJICAgICAoc3RydWN0IG1zZ2hkciBfX3VzZXIgKillbnRyeSwKKwkJCQkJICAgICAmbXNnX3N5cywgZmxhZ3MgJiB+TVNHX1dBSVRGT1JPTkUsCisJCQkJCSAgICAgZGF0YWdyYW1zKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWJyZWFrOworCQkJZXJyID0gbXlwdXRfdXNlcihlcnIsICZlbnRyeS0+bXNnX2xlbik7CisJCQkrK2VudHJ5OworCQl9CisKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCQkrK2RhdGFncmFtczsKKworCQkvKiBNU0dfV0FJVEZPUk9ORSB0dXJucyBvbiBNU0dfRE9OVFdBSVQgYWZ0ZXIgb25lIHBhY2tldCAqLworCQlpZiAoZmxhZ3MgJiBNU0dfV0FJVEZPUk9ORSkKKwkJCWZsYWdzIHw9IE1TR19ET05UV0FJVDsKKworCQlpZiAodGltZW91dCkgeworCQkJa3RpbWVfZ2V0X3RzKHRpbWVvdXQpOworCQkJKnRpbWVvdXQgPSB0aW1lc3BlY19zdWIoZW5kX3RpbWUsICp0aW1lb3V0KTsKKwkJCWlmICh0aW1lb3V0LT50dl9zZWMgPCAwKSB7CisJCQkJdGltZW91dC0+dHZfc2VjID0gdGltZW91dC0+dHZfbnNlYyA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIFRpbWVvdXQsIHJldHVybiBsZXNzIHRoYW4gdmxlbiBkYXRhZ3JhbXMgKi8KKwkJCWlmICh0aW1lb3V0LT50dl9uc2VjID09IDAgJiYgdGltZW91dC0+dHZfc2VjID09IDApCisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBPdXQgb2YgYmFuZCBkYXRhLCByZXR1cm4gcmlnaHQgYXdheSAqLworCQlpZiAobXNnX3N5cy5tc2dfZmxhZ3MgJiBNU0dfT09CKQorCQkJYnJlYWs7CisJfQorCitvdXRfcHV0OgorCWZwdXRfbGlnaHQoc29jay0+ZmlsZSwgZnB1dF9uZWVkZWQpOworCisJaWYgKGVyciA9PSAwKQorCQlyZXR1cm4gZGF0YWdyYW1zOworCisJaWYgKGRhdGFncmFtcyAhPSAwKSB7CisJCS8qCisJCSAqIFdlIG1heSByZXR1cm4gbGVzcyBlbnRyaWVzIHRoYW4gcmVxdWVzdGVkICh2bGVuKSBpZiB0aGUKKwkJICogc29jayBpcyBub24gYmxvY2sgYW5kIHRoZXJlIGFyZW4ndCBlbm91Z2ggZGF0YWdyYW1zLi4uCisJCSAqLworCQlpZiAoZXJyICE9IC1FQUdBSU4pIHsKKwkJCS8qCisJCQkgKiAuLi4gb3IgIGlmIHJlY3Ztc2cgcmV0dXJucyBhbiBlcnJvciBhZnRlciB3ZQorCQkJICogcmVjZWl2ZWQgc29tZSBkYXRhZ3JhbXMsIHdoZXJlIHdlIHJlY29yZCB0aGUKKwkJCSAqIGVycm9yIHRvIHJldHVybiBvbiB0aGUgbmV4dCBjYWxsIG9yIGlmIHRoZQorCQkJICogYXBwIGFza3MgYWJvdXQgaXQgdXNpbmcgZ2V0c29ja29wdChTT19FUlJPUikuCisJCQkgKi8KKwkJCXNvY2stPnNrLT5za19lcnIgPSAtZXJyOworCQl9CisKKwkJcmV0dXJuIGRhdGFncmFtczsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisKK1NZU0NBTExfREVGSU5FNShteXJlY3ZtbXNnLCBpbnQsIGZkLCBzdHJ1Y3QgbW1zZ2hkciBfX3VzZXIgKiwgbW1zZywKKwkJdW5zaWduZWQgaW50LCB2bGVuLCB1bnNpZ25lZCBpbnQsIGZsYWdzLAorCQlzdHJ1Y3QgdGltZXNwZWMgX191c2VyICosIHRpbWVvdXQpCit7CisJaW50IGRhdGFncmFtczsKKwlzdHJ1Y3QgdGltZXNwZWMgdGltZW91dF9zeXM7CisKKwlpZiAoZmxhZ3MgJiBNU0dfQ01TR19DT01QQVQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCF0aW1lb3V0KQorCQlyZXR1cm4gX19zeXNfbXlyZWN2bW1zZyhmZCwgbW1zZywgdmxlbiwgZmxhZ3MsIE5VTEwpOworCisJbWVtY3B5KCZ0aW1lb3V0X3N5cywgdGltZW91dCwgc2l6ZW9mKHRpbWVvdXRfc3lzKSk7CisJZGF0YWdyYW1zID0gX19zeXNfbXlyZWN2bW1zZyhmZCwgbW1zZywgdmxlbiwgZmxhZ3MsICZ0aW1lb3V0X3N5cyk7CisKKwlpZiAoZGF0YWdyYW1zID4gMCAmJgorCSAgICAhbWVtY3B5KHRpbWVvdXQsICZ0aW1lb3V0X3N5cywgc2l6ZW9mKHRpbWVvdXRfc3lzKSkpCisJCWRhdGFncmFtcyA9IC1FRkFVTFQ7CisKKwlyZXR1cm4gZGF0YWdyYW1zOworfQorCisKKworLyoKKyAqCUJTRCBzZW5kbXNnIGludGVyZmFjZQorICovCisKKworU1lTQ0FMTF9ERUZJTkUzKG15YmluZCwgaW50LCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqLCB1bXlhZGRyLCBpbnQsIGFkZHJsZW4pCit7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyZXNzOworCWludCBlcnIsIGZwdXRfbmVlZGVkOworCisJc29jayA9IHNvY2tmZF9sb29rdXBfbGlnaHQoZmQsICZlcnIsICZmcHV0X25lZWRlZCk7CisJaWYgKHNvY2spIHsKKwkJZXJyID0gbXltb3ZlX2FkZHJfdG9fa2VybmVsKHVteWFkZHIsIGFkZHJsZW4sICZhZGRyZXNzKTsKKwkJaWYgKGVyciA+PSAwKSB7CisJCQllcnIgPSBzZWN1cml0eV9zb2NrZXRfYmluZChzb2NrLAorCQkJCQkJICAgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyZXNzLAorCQkJCQkJICAgYWRkcmxlbik7CisJCQlpZiAoIWVycikKKwkJCQllcnIgPSBzb2NrLT5vcHMtPmJpbmQoc29jaywKKwkJCQkJCSAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikKKwkJCQkJCSAgICAgICZhZGRyZXNzLCBhZGRybGVuKTsKKwkJfQorCQlmcHV0X2xpZ2h0KHNvY2stPmZpbGUsIGZwdXRfbmVlZGVkKTsKKwl9CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woc3lzX215YmluZCk7CisKKworU1lTQ0FMTF9ERUZJTkUzKG15Y29ubmVjdCwgaW50LCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqLCB1c2VydmFkZHIsCisJCWludCwgYWRkcmxlbikKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHJlc3M7CisJaW50IGVyciwgZnB1dF9uZWVkZWQ7CisKKwlzb2NrID0gc29ja2ZkX2xvb2t1cF9saWdodChmZCwgJmVyciwgJmZwdXRfbmVlZGVkKTsKKwlpZiAoIXNvY2spCisJeworCQlwcmludF9zdW4oU1VOX0RCRywiMTo9PT0+XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCWVyciA9IG15bW92ZV9hZGRyX3RvX2tlcm5lbCh1c2VydmFkZHIsIGFkZHJsZW4sICZhZGRyZXNzKTsKKwlwcmludF9zdW4oU1VOX0RCRywiMjo9PT0+JWRcbiIsIGVycik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X3B1dDsKKworCWVyciA9CisJICAgIHNlY3VyaXR5X3NvY2tldF9jb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcmVzcywgYWRkcmxlbik7CisJaWYgKGVycikKKwkJZ290byBvdXRfcHV0OworCisJZXJyID0gc29jay0+b3BzLT5jb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcmVzcywgYWRkcmxlbiwKKwkJCQkgc29jay0+ZmlsZS0+Zl9mbGFncyk7CitvdXRfcHV0OgorCWZwdXRfbGlnaHQoc29jay0+ZmlsZSwgZnB1dF9uZWVkZWQpOworb3V0OgorCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKHN5c19teWNvbm5lY3QpOworCitTWVNDQUxMX0RFRklORTYobXlzZW5kdG8sIGludCwgZmQsIHZvaWQgX191c2VyICosIGJ1ZmYsIHNpemVfdCwgbGVuLAorCQl1bnNpZ25lZCwgZmxhZ3MsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKiwgYWRkciwKKwkJaW50LCBhZGRyX2xlbikKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHJlc3M7CisJaW50IGVycjsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3QgaW92ZWMgaW92OworCWludCBmcHV0X25lZWRlZDsKKworCWlmIChsZW4gPiBJTlRfTUFYKQorCQlsZW4gPSBJTlRfTUFYOworCXNvY2sgPSBzb2NrZmRfbG9va3VwX2xpZ2h0KGZkLCAmZXJyLCAmZnB1dF9uZWVkZWQpOworCWlmICghc29jaykKKwkJZ290byBvdXQ7CisKKwlpb3YuaW92X2Jhc2UgPSBidWZmOworCWlvdi5pb3ZfbGVuID0gbGVuOworCW1zZy5tc2dfbmFtZSA9IE5VTEw7CisJbXNnLm1zZ19pb3YgPSAmaW92OworCW1zZy5tc2dfaW92bGVuID0gMTsKKwltc2cubXNnX2NvbnRyb2wgPSBOVUxMOworCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7CisJbXNnLm1zZ19uYW1lbGVuID0gMDsKKwlpZiAoYWRkcikgeworCQllcnIgPSBteW1vdmVfYWRkcl90b19rZXJuZWwoYWRkciwgYWRkcl9sZW4sICZhZGRyZXNzKTsKKwkJcHJpbnRfc3VuKFNVTl9EQkcsIltjb21sZWVdOnNlbmRpdG89MT0+JWRcbiIsIGVycik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXRfcHV0OworCQltc2cubXNnX25hbWUgPSAoc3RydWN0IHNvY2thZGRyICopJmFkZHJlc3M7CisJCW1zZy5tc2dfbmFtZWxlbiA9IGFkZHJfbGVuOworCX0KKwlpZiAoc29jay0+ZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCWZsYWdzIHw9IE1TR19ET05UV0FJVDsKKwltc2cubXNnX2ZsYWdzID0gZmxhZ3M7CisJZXJyID0gc29ja19zZW5kbXNnKHNvY2ssICZtc2csIGxlbik7CisKK291dF9wdXQ6CisJZnB1dF9saWdodChzb2NrLT5maWxlLCBmcHV0X25lZWRlZCk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworCitTWVNDQUxMX0RFRklORTQobXlhY2NlcHQ0LCBpbnQsIGZkLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICosIHVwZWVyX3NvY2thZGRyLAorCQlpbnQgX191c2VyICosIHVwZWVyX2FkZHJsZW4sIGludCwgZmxhZ3MpCit7CisJc3RydWN0IHNvY2tldCAqc29jaywgKm5ld3NvY2s7CisJc3RydWN0IGZpbGUgKm5ld2ZpbGU7CisJaW50IGVyciwgbGVuLCBuZXdmZCwgZnB1dF9uZWVkZWQ7CisJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcmVzczsKKworCWlmIChmbGFncyAmIH4oU09DS19DTE9FWEVDIHwgU09DS19OT05CTE9DSykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKFNPQ0tfTk9OQkxPQ0sgIT0gT19OT05CTE9DSyAmJiAoZmxhZ3MgJiBTT0NLX05PTkJMT0NLKSkKKwkJZmxhZ3MgPSAoZmxhZ3MgJiB+U09DS19OT05CTE9DSykgfCBPX05PTkJMT0NLOworCisJc29jayA9IHNvY2tmZF9sb29rdXBfbGlnaHQoZmQsICZlcnIsICZmcHV0X25lZWRlZCk7CisJaWYgKCFzb2NrKQorCQlnb3RvIG91dDsKKworCWVyciA9IC1FTkZJTEU7CisJbmV3c29jayA9IHNvY2tfYWxsb2MoKTsKKwlpZiAoIW5ld3NvY2spCisJCWdvdG8gb3V0X3B1dDsKKworCW5ld3NvY2stPnR5cGUgPSBzb2NrLT50eXBlOworCW5ld3NvY2stPm9wcyA9IHNvY2stPm9wczsKKworCS8qCisJICogV2UgZG9uJ3QgbmVlZCB0cnlfbW9kdWxlX2dldCBoZXJlLCBhcyB0aGUgbGlzdGVuaW5nIHNvY2tldCAoc29jaykKKwkgKiBoYXMgdGhlIHByb3RvY29sIG1vZHVsZSAoc29jay0+b3BzLT5vd25lcikgaGVsZC4KKwkgKi8KKwlfX21vZHVsZV9nZXQobmV3c29jay0+b3BzLT5vd25lcik7CisKKwluZXdmZCA9IHNvY2tfYWxsb2NfZmlsZShuZXdzb2NrLCAmbmV3ZmlsZSwgZmxhZ3MpOworCWlmICh1bmxpa2VseShuZXdmZCA8IDApKSB7CisJCWVyciA9IG5ld2ZkOworCQlzb2NrX3JlbGVhc2UobmV3c29jayk7CisJCWdvdG8gb3V0X3B1dDsKKwl9CisKKwllcnIgPSBzZWN1cml0eV9zb2NrZXRfYWNjZXB0KHNvY2ssIG5ld3NvY2spOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZkOworCisJZXJyID0gc29jay0+b3BzLT5hY2NlcHQoc29jaywgbmV3c29jaywgc29jay0+ZmlsZS0+Zl9mbGFncyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X2ZkOworCisJaWYgKHVwZWVyX3NvY2thZGRyKSB7CisJCWlmIChuZXdzb2NrLT5vcHMtPmdldG5hbWUobmV3c29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyZXNzLAorCQkJCQkgICZsZW4sIDIpIDwgMCkgeworCQkJZXJyID0gLUVDT05OQUJPUlRFRDsKKwkJCWdvdG8gb3V0X2ZkOworCQl9CisJCWVyciA9IG15bW92ZV9hZGRyX3RvX3VzZXIoJmFkZHJlc3MsCisJCQkJCWxlbiwgdXBlZXJfc29ja2FkZHIsIHVwZWVyX2FkZHJsZW4pOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0X2ZkOworCX0KKworCS8qIEZpbGUgZmxhZ3MgYXJlIG5vdCBpbmhlcml0ZWQgdmlhIGFjY2VwdCgpIHVubGlrZSBhbm90aGVyIE9TZXMuICovCisKKwlmZF9pbnN0YWxsKG5ld2ZkLCBuZXdmaWxlKTsKKwllcnIgPSBuZXdmZDsKKworb3V0X3B1dDoKKwlmcHV0X2xpZ2h0KHNvY2stPmZpbGUsIGZwdXRfbmVlZGVkKTsKK291dDoKKwlyZXR1cm4gZXJyOworb3V0X2ZkOgorCWZwdXQobmV3ZmlsZSk7CisJcHV0X3VudXNlZF9mZChuZXdmZCk7CisJZ290byBvdXRfcHV0OworfQorCisKK1NZU0NBTExfREVGSU5FMyhteWFjY2VwdCwgaW50LCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqLCB1cGVlcl9zb2NrYWRkciwKKwkJaW50IF9fdXNlciAqLCB1cGVlcl9hZGRybGVuKQoreworCXJldHVybiBzeXNfbXlhY2NlcHQ0KGZkLCB1cGVlcl9zb2NrYWRkciwgdXBlZXJfYWRkcmxlbiwgMCk7Cit9CitFWFBPUlRfU1lNQk9MKHN5c19teWFjY2VwdCk7CisKK1NZU0NBTExfREVGSU5FMyhteWdldHNvY2tuYW1lLCBpbnQsIGZkLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICosIHVzb2NrYWRkciwKKwkJaW50IF9fdXNlciAqLCB1c29ja2FkZHJfbGVuKQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcmVzczsKKwlpbnQgbGVuLCBlcnIsIGZwdXRfbmVlZGVkOworCisJc29jayA9IHNvY2tmZF9sb29rdXBfbGlnaHQoZmQsICZlcnIsICZmcHV0X25lZWRlZCk7CisJaWYgKCFzb2NrKQorCQlnb3RvIG91dDsKKworCWVyciA9IHNlY3VyaXR5X3NvY2tldF9nZXRzb2NrbmFtZShzb2NrKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9wdXQ7CisKKwllcnIgPSBzb2NrLT5vcHMtPmdldG5hbWUoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyZXNzLCAmbGVuLCAwKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9wdXQ7CisJZXJyID0gbXltb3ZlX2FkZHJfdG9fdXNlcigmYWRkcmVzcywgbGVuLCB1c29ja2FkZHIsIHVzb2NrYWRkcl9sZW4pOworCitvdXRfcHV0OgorCWZwdXRfbGlnaHQoc29jay0+ZmlsZSwgZnB1dF9uZWVkZWQpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKworU1lTQ0FMTF9ERUZJTkUzKG15Z2V0cGVlcm5hbWUsIGludCwgZmQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKiwgdXNvY2thZGRyLAorCQlpbnQgX191c2VyICosIHVzb2NrYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyZXNzOworCWludCBsZW4sIGVyciwgZnB1dF9uZWVkZWQ7CisKKwlzb2NrID0gc29ja2ZkX2xvb2t1cF9saWdodChmZCwgJmVyciwgJmZwdXRfbmVlZGVkKTsKKwlpZiAoc29jayAhPSBOVUxMKSB7CisJCWVyciA9IHNlY3VyaXR5X3NvY2tldF9nZXRwZWVybmFtZShzb2NrKTsKKwkJaWYgKGVycikgeworCQkJZnB1dF9saWdodChzb2NrLT5maWxlLCBmcHV0X25lZWRlZCk7CisJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJZXJyID0KKwkJICAgIHNvY2stPm9wcy0+Z2V0bmFtZShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHJlc3MsICZsZW4sCisJCQkJICAgICAgIDEpOworCQlpZiAoIWVycikKKwkJCWVyciA9IG15bW92ZV9hZGRyX3RvX3VzZXIoJmFkZHJlc3MsIGxlbiwgdXNvY2thZGRyLAorCQkJCQkJdXNvY2thZGRyX2xlbik7CisJCWZwdXRfbGlnaHQoc29jay0+ZmlsZSwgZnB1dF9uZWVkZWQpOworCX0KKwlyZXR1cm4gZXJyOworfQorCisKK1NZU0NBTExfREVGSU5FNihteXJlY3Zmcm9tLCBpbnQsIGZkLCB2b2lkIF9fdXNlciAqLCB1YnVmLCBzaXplX3QsIHNpemUsCisJCXVuc2lnbmVkLCBmbGFncywgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqLCBhZGRyLAorCQlpbnQgX191c2VyICosIGFkZHJfbGVuKQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisJc3RydWN0IGlvdmVjIGlvdjsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyZXNzOworCWludCBlcnIsIGVycjI7CisJaW50IGZwdXRfbmVlZGVkOworCisJaWYgKHNpemUgPiBJTlRfTUFYKQorCQlzaXplID0gSU5UX01BWDsKKwlzb2NrID0gc29ja2ZkX2xvb2t1cF9saWdodChmZCwgJmVyciwgJmZwdXRfbmVlZGVkKTsKKwlpZiAoIXNvY2spCisJCWdvdG8gb3V0OworCisJbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfaW92bGVuID0gMTsKKwltc2cubXNnX2lvdiA9ICZpb3Y7CisJaW92Lmlvdl9sZW4gPSBzaXplOworCWlvdi5pb3ZfYmFzZSA9IHVidWY7CisJLyogU2F2ZSBzb21lIGN5Y2xlcyBhbmQgZG9uJ3QgY29weSB0aGUgYWRkcmVzcyBpZiBub3QgbmVlZGVkICovCisJbXNnLm1zZ19uYW1lID0gYWRkciA/IChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcmVzcyA6IE5VTEw7CisJLyogV2UgYXNzdW1lIGFsbCBrZXJuZWwgY29kZSBrbm93cyB0aGUgc2l6ZSBvZiBzb2NrYWRkcl9zdG9yYWdlICovCisJbXNnLm1zZ19uYW1lbGVuID0gMDsKKwlpZiAoc29jay0+ZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCWZsYWdzIHw9IE1TR19ET05UV0FJVDsKKwllcnIgPSBzb2NrX3JlY3Ztc2coc29jaywgJm1zZywgc2l6ZSwgZmxhZ3MpOworCisJaWYgKGVyciA+PSAwICYmIGFkZHIgIT0gTlVMTCkgeworCQllcnIyID0gbXltb3ZlX2FkZHJfdG9fdXNlcigmYWRkcmVzcywKKwkJCQkJIG1zZy5tc2dfbmFtZWxlbiwgYWRkciwgYWRkcl9sZW4pOworCQlpZiAoZXJyMiA8IDApCisJCQllcnIgPSBlcnIyOworCX0KKworCWZwdXRfbGlnaHQoc29jay0+ZmlsZSwgZnB1dF9uZWVkZWQpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKgorICoJQ3JlYXRlIGEgcGFpciBvZiBjb25uZWN0ZWQgc29ja2V0cy4KKyAqLworCitTWVNDQUxMX0RFRklORTQoc29ja2V0cGFpciwgaW50LCBmYW1pbHksIGludCwgdHlwZSwgaW50LCBwcm90b2NvbCwKKwkJaW50IF9fdXNlciAqLCB1c29ja3ZlYykKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrMSwgKnNvY2syOworCWludCBmZDEsIGZkMiwgZXJyOworCXN0cnVjdCBmaWxlICpuZXdmaWxlMSwgKm5ld2ZpbGUyOworCWludCBmbGFnczsKKworCWZsYWdzID0gdHlwZSAmIH5TT0NLX1RZUEVfTUFTSzsKKwlpZiAoZmxhZ3MgJiB+KFNPQ0tfQ0xPRVhFQyB8IFNPQ0tfTk9OQkxPQ0spKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl0eXBlICY9IFNPQ0tfVFlQRV9NQVNLOworCisJaWYgKFNPQ0tfTk9OQkxPQ0sgIT0gT19OT05CTE9DSyAmJiAoZmxhZ3MgJiBTT0NLX05PTkJMT0NLKSkKKwkJZmxhZ3MgPSAoZmxhZ3MgJiB+U09DS19OT05CTE9DSykgfCBPX05PTkJMT0NLOworCisJLyoKKwkgKiBPYnRhaW4gdGhlIGZpcnN0IHNvY2tldCBhbmQgY2hlY2sgaWYgdGhlIHVuZGVybHlpbmcgcHJvdG9jb2wKKwkgKiBzdXBwb3J0cyB0aGUgc29ja2V0cGFpciBjYWxsLgorCSAqLworCisJZXJyID0gc29ja19jcmVhdGUoZmFtaWx5LCB0eXBlLCBwcm90b2NvbCwgJnNvY2sxKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBzb2NrX2NyZWF0ZShmYW1pbHksIHR5cGUsIHByb3RvY29sLCAmc29jazIpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9yZWxlYXNlXzE7CisKKwllcnIgPSBzb2NrMS0+b3BzLT5zb2NrZXRwYWlyKHNvY2sxLCBzb2NrMik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X3JlbGVhc2VfYm90aDsKKworCWZkMSA9IHNvY2tfYWxsb2NfZmlsZShzb2NrMSwgJm5ld2ZpbGUxLCBmbGFncyk7CisJaWYgKHVubGlrZWx5KGZkMSA8IDApKSB7CisJCWVyciA9IGZkMTsKKwkJZ290byBvdXRfcmVsZWFzZV9ib3RoOworCX0KKworCWZkMiA9IHNvY2tfYWxsb2NfZmlsZShzb2NrMiwgJm5ld2ZpbGUyLCBmbGFncyk7CisJaWYgKHVubGlrZWx5KGZkMiA8IDApKSB7CisJCWVyciA9IGZkMjsKKwkJZnB1dChuZXdmaWxlMSk7CisJCXB1dF91bnVzZWRfZmQoZmQxKTsKKwkJc29ja19yZWxlYXNlKHNvY2syKTsKKwkJZ290byBvdXQ7CisJfQorCisJYXVkaXRfZmRfcGFpcihmZDEsIGZkMik7CisJZmRfaW5zdGFsbChmZDEsIG5ld2ZpbGUxKTsKKwlmZF9pbnN0YWxsKGZkMiwgbmV3ZmlsZTIpOworCS8qIGZkMSBhbmQgZmQyIG1heSBiZSBhbHJlYWR5IGFub3RoZXIgZGVzY3JpcHRvcnMuCisJICogTm90IGtlcm5lbCBwcm9ibGVtLgorCSAqLworCisJZXJyID0gcHV0X3VzZXIoZmQxLCAmdXNvY2t2ZWNbMF0pOworCWlmICghZXJyKQorCQllcnIgPSBwdXRfdXNlcihmZDIsICZ1c29ja3ZlY1sxXSk7CisJaWYgKCFlcnIpCisJCXJldHVybiAwOworCisJc3lzX2Nsb3NlKGZkMik7CisJc3lzX2Nsb3NlKGZkMSk7CisJcmV0dXJuIGVycjsKKworb3V0X3JlbGVhc2VfYm90aDoKKwlzb2NrX3JlbGVhc2Uoc29jazIpOworb3V0X3JlbGVhc2VfMToKKwlzb2NrX3JlbGVhc2Uoc29jazEpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKglCaW5kIGEgbmFtZSB0byBhIHNvY2tldC4gTm90aGluZyBtdWNoIHRvIGRvIGhlcmUgc2luY2UgaXQncworICoJdGhlIHByb3RvY29sJ3MgcmVzcG9uc2liaWxpdHkgdG8gaGFuZGxlIHRoZSBsb2NhbCBhZGRyZXNzLgorICoKKyAqCVdlIG1vdmUgdGhlIHNvY2tldCBhZGRyZXNzIHRvIGtlcm5lbCBzcGFjZSBiZWZvcmUgd2UgY2FsbAorICoJdGhlIHByb3RvY29sIGxheWVyIChoYXZpbmcgYWxzbyBjaGVja2VkIHRoZSBhZGRyZXNzIGlzIG9rKS4KKyAqLworCitTWVNDQUxMX0RFRklORTMoYmluZCwgaW50LCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqLCB1bXlhZGRyLCBpbnQsIGFkZHJsZW4pCit7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyZXNzOworCWludCBlcnIsIGZwdXRfbmVlZGVkOworCisJc29jayA9IHNvY2tmZF9sb29rdXBfbGlnaHQoZmQsICZlcnIsICZmcHV0X25lZWRlZCk7CisJaWYgKHNvY2spIHsKKwkJZXJyID0gbW92ZV9hZGRyX3RvX2tlcm5lbCh1bXlhZGRyLCBhZGRybGVuLCAmYWRkcmVzcyk7CisJCWlmIChlcnIgPj0gMCkgeworCQkJZXJyID0gc2VjdXJpdHlfc29ja2V0X2JpbmQoc29jaywKKwkJCQkJCSAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcmVzcywKKwkJCQkJCSAgIGFkZHJsZW4pOworCQkJaWYgKCFlcnIpCisJCQkJZXJyID0gc29jay0+b3BzLT5iaW5kKHNvY2ssCisJCQkJCQkgICAgICAoc3RydWN0IHNvY2thZGRyICopCisJCQkJCQkgICAgICAmYWRkcmVzcywgYWRkcmxlbik7CisJCX0KKwkJZnB1dF9saWdodChzb2NrLT5maWxlLCBmcHV0X25lZWRlZCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKglQZXJmb3JtIGEgbGlzdGVuLiBCYXNpY2FsbHksIHdlIGFsbG93IHRoZSBwcm90b2NvbCB0byBkbyBhbnl0aGluZworICoJbmVjZXNzYXJ5IGZvciBhIGxpc3RlbiwgYW5kIGlmIHRoYXQgd29ya3MsIHdlIG1hcmsgdGhlIHNvY2tldCBhcworICoJcmVhZHkgZm9yIGxpc3RlbmluZy4KKyAqLworCitTWVNDQUxMX0RFRklORTIobGlzdGVuLCBpbnQsIGZkLCBpbnQsIGJhY2tsb2cpCit7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwlpbnQgZXJyLCBmcHV0X25lZWRlZDsKKwlpbnQgc29tYXhjb25uOworCisJc29jayA9IHNvY2tmZF9sb29rdXBfbGlnaHQoZmQsICZlcnIsICZmcHV0X25lZWRlZCk7CisJaWYgKHNvY2spIHsKKwkJc29tYXhjb25uID0gc29ja19uZXQoc29jay0+c2spLT5jb3JlLnN5c2N0bF9zb21heGNvbm47CisJCWlmICgodW5zaWduZWQpYmFja2xvZyA+IHNvbWF4Y29ubikKKwkJCWJhY2tsb2cgPSBzb21heGNvbm47CisKKwkJZXJyID0gc2VjdXJpdHlfc29ja2V0X2xpc3Rlbihzb2NrLCBiYWNrbG9nKTsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSBzb2NrLT5vcHMtPmxpc3Rlbihzb2NrLCBiYWNrbG9nKTsKKworCQlmcHV0X2xpZ2h0KHNvY2stPmZpbGUsIGZwdXRfbmVlZGVkKTsKKwl9CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woc3lzX2xpc3Rlbik7CisKKy8qCisgKglGb3IgYWNjZXB0LCB3ZSBhdHRlbXB0IHRvIGNyZWF0ZSBhIG5ldyBzb2NrZXQsIHNldCB1cCB0aGUgbGluaworICoJd2l0aCB0aGUgY2xpZW50LCB3YWtlIHVwIHRoZSBjbGllbnQsIHRoZW4gcmV0dXJuIHRoZSBuZXcKKyAqCWNvbm5lY3RlZCBmZC4gV2UgY29sbGVjdCB0aGUgYWRkcmVzcyBvZiB0aGUgY29ubmVjdG9yIGluIGtlcm5lbAorICoJc3BhY2UgYW5kIG1vdmUgaXQgdG8gdXNlciBhdCB0aGUgdmVyeSBlbmQuIFRoaXMgaXMgdW5jbGVhbiBiZWNhdXNlCisgKgl3ZSBvcGVuIHRoZSBzb2NrZXQgdGhlbiByZXR1cm4gYW4gZXJyb3IuCisgKgorICoJMTAwMy4xZyBhZGRzIHRoZSBhYmlsaXR5IHRvIHJlY3Ztc2coKSB0byBxdWVyeSBjb25uZWN0aW9uIHBlbmRpbmcKKyAqCXN0YXR1cyB0byByZWN2bXNnLiBXZSBuZWVkIHRvIGFkZCB0aGF0IHN1cHBvcnQgaW4gYSB3YXkgdGhhdHMKKyAqCWNsZWFuIHdoZW4gd2UgcmVzdHVjdHVyZSBhY2NlcHQgYWxzby4KKyAqLworCitTWVNDQUxMX0RFRklORTQoYWNjZXB0NCwgaW50LCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqLCB1cGVlcl9zb2NrYWRkciwKKwkJaW50IF9fdXNlciAqLCB1cGVlcl9hZGRybGVuLCBpbnQsIGZsYWdzKQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2ssICpuZXdzb2NrOworCXN0cnVjdCBmaWxlICpuZXdmaWxlOworCWludCBlcnIsIGxlbiwgbmV3ZmQsIGZwdXRfbmVlZGVkOworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHJlc3M7CisKKwlpZiAoZmxhZ3MgJiB+KFNPQ0tfQ0xPRVhFQyB8IFNPQ0tfTk9OQkxPQ0spKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChTT0NLX05PTkJMT0NLICE9IE9fTk9OQkxPQ0sgJiYgKGZsYWdzICYgU09DS19OT05CTE9DSykpCisJCWZsYWdzID0gKGZsYWdzICYgflNPQ0tfTk9OQkxPQ0spIHwgT19OT05CTE9DSzsKKworCXNvY2sgPSBzb2NrZmRfbG9va3VwX2xpZ2h0KGZkLCAmZXJyLCAmZnB1dF9uZWVkZWQpOworCWlmICghc29jaykKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRU5GSUxFOworCW5ld3NvY2sgPSBzb2NrX2FsbG9jKCk7CisJaWYgKCFuZXdzb2NrKQorCQlnb3RvIG91dF9wdXQ7CisKKwluZXdzb2NrLT50eXBlID0gc29jay0+dHlwZTsKKwluZXdzb2NrLT5vcHMgPSBzb2NrLT5vcHM7CisKKwkvKgorCSAqIFdlIGRvbid0IG5lZWQgdHJ5X21vZHVsZV9nZXQgaGVyZSwgYXMgdGhlIGxpc3RlbmluZyBzb2NrZXQgKHNvY2spCisJICogaGFzIHRoZSBwcm90b2NvbCBtb2R1bGUgKHNvY2stPm9wcy0+b3duZXIpIGhlbGQuCisJICovCisJX19tb2R1bGVfZ2V0KG5ld3NvY2stPm9wcy0+b3duZXIpOworCisJbmV3ZmQgPSBzb2NrX2FsbG9jX2ZpbGUobmV3c29jaywgJm5ld2ZpbGUsIGZsYWdzKTsKKwlpZiAodW5saWtlbHkobmV3ZmQgPCAwKSkgeworCQllcnIgPSBuZXdmZDsKKwkJc29ja19yZWxlYXNlKG5ld3NvY2spOworCQlnb3RvIG91dF9wdXQ7CisJfQorCisJZXJyID0gc2VjdXJpdHlfc29ja2V0X2FjY2VwdChzb2NrLCBuZXdzb2NrKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mZDsKKworCWVyciA9IHNvY2stPm9wcy0+YWNjZXB0KHNvY2ssIG5ld3NvY2ssIHNvY2stPmZpbGUtPmZfZmxhZ3MpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9mZDsKKworCWlmICh1cGVlcl9zb2NrYWRkcikgeworCQlpZiAobmV3c29jay0+b3BzLT5nZXRuYW1lKG5ld3NvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcmVzcywKKwkJCQkJICAmbGVuLCAyKSA8IDApIHsKKwkJCWVyciA9IC1FQ09OTkFCT1JURUQ7CisJCQlnb3RvIG91dF9mZDsKKwkJfQorCQllcnIgPSBtb3ZlX2FkZHJfdG9fdXNlcigmYWRkcmVzcywKKwkJCQkJbGVuLCB1cGVlcl9zb2NrYWRkciwgdXBlZXJfYWRkcmxlbik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXRfZmQ7CisJfQorCisJLyogRmlsZSBmbGFncyBhcmUgbm90IGluaGVyaXRlZCB2aWEgYWNjZXB0KCkgdW5saWtlIGFub3RoZXIgT1Nlcy4gKi8KKworCWZkX2luc3RhbGwobmV3ZmQsIG5ld2ZpbGUpOworCWVyciA9IG5ld2ZkOworCitvdXRfcHV0OgorCWZwdXRfbGlnaHQoc29jay0+ZmlsZSwgZnB1dF9uZWVkZWQpOworb3V0OgorCXJldHVybiBlcnI7CitvdXRfZmQ6CisJZnB1dChuZXdmaWxlKTsKKwlwdXRfdW51c2VkX2ZkKG5ld2ZkKTsKKwlnb3RvIG91dF9wdXQ7Cit9CisKK1NZU0NBTExfREVGSU5FMyhhY2NlcHQsIGludCwgZmQsIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKiwgdXBlZXJfc29ja2FkZHIsCisJCWludCBfX3VzZXIgKiwgdXBlZXJfYWRkcmxlbikKK3sKKwlyZXR1cm4gc3lzX2FjY2VwdDQoZmQsIHVwZWVyX3NvY2thZGRyLCB1cGVlcl9hZGRybGVuLCAwKTsKK30KKworLyoKKyAqCUF0dGVtcHQgdG8gY29ubmVjdCB0byBhIHNvY2tldCB3aXRoIHRoZSBzZXJ2ZXIgYWRkcmVzcy4gIFRoZSBhZGRyZXNzCisgKglpcyBpbiB1c2VyIHNwYWNlIHNvIHdlIHZlcmlmeSBpdCBpcyBPSyBhbmQgbW92ZSBpdCB0byBrZXJuZWwgc3BhY2UuCisgKgorICoJRm9yIDEwMDMuMWcgd2UgbmVlZCB0byBhZGQgY2xlYW4gc3VwcG9ydCBmb3IgYSBiaW5kIHRvIEFGX1VOU1BFQyB0bworICoJYnJlYWsgYmluZGluZ3MKKyAqCisgKglOT1RFOiAxMDAzLjFnIGRyYWZ0IDYuMyBpcyBicm9rZW4gd2l0aCByZXNwZWN0IHRvIEFYLjI1L05ldFJPTSBhbmQKKyAqCW90aGVyIFNFUVBBQ0tFVCBwcm90b2NvbHMgdGhhdCB0YWtlIHRpbWUgdG8gY29ubmVjdCgpIGFzIGl0IGRvZXNuJ3QKKyAqCWluY2x1ZGUgdGhlIC1FSU5QUk9HUkVTUyBzdGF0dXMgZm9yIHN1Y2ggc29ja2V0cy4KKyAqLworCitTWVNDQUxMX0RFRklORTMoY29ubmVjdCwgaW50LCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqLCB1c2VydmFkZHIsCisJCWludCwgYWRkcmxlbikKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHJlc3M7CisJaW50IGVyciwgZnB1dF9uZWVkZWQ7CisKKwlzb2NrID0gc29ja2ZkX2xvb2t1cF9saWdodChmZCwgJmVyciwgJmZwdXRfbmVlZGVkKTsKKwlpZiAoIXNvY2spCisJCWdvdG8gb3V0OworCWVyciA9IG1vdmVfYWRkcl90b19rZXJuZWwodXNlcnZhZGRyLCBhZGRybGVuLCAmYWRkcmVzcyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X3B1dDsKKworCWVyciA9CisJICAgIHNlY3VyaXR5X3NvY2tldF9jb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcmVzcywgYWRkcmxlbik7CisJaWYgKGVycikKKwkJZ290byBvdXRfcHV0OworCisJZXJyID0gc29jay0+b3BzLT5jb25uZWN0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcmVzcywgYWRkcmxlbiwKKwkJCQkgc29jay0+ZmlsZS0+Zl9mbGFncyk7CitvdXRfcHV0OgorCWZwdXRfbGlnaHQoc29jay0+ZmlsZSwgZnB1dF9uZWVkZWQpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKglHZXQgdGhlIGxvY2FsIGFkZHJlc3MgKCduYW1lJykgb2YgYSBzb2NrZXQgb2JqZWN0LiBNb3ZlIHRoZSBvYnRhaW5lZAorICoJbmFtZSB0byB1c2VyIHNwYWNlLgorICovCisKK1NZU0NBTExfREVGSU5FMyhnZXRzb2NrbmFtZSwgaW50LCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqLCB1c29ja2FkZHIsCisJCWludCBfX3VzZXIgKiwgdXNvY2thZGRyX2xlbikKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHJlc3M7CisJaW50IGxlbiwgZXJyLCBmcHV0X25lZWRlZDsKKworCXNvY2sgPSBzb2NrZmRfbG9va3VwX2xpZ2h0KGZkLCAmZXJyLCAmZnB1dF9uZWVkZWQpOworCWlmICghc29jaykKKwkJZ290byBvdXQ7CisKKwllcnIgPSBzZWN1cml0eV9zb2NrZXRfZ2V0c29ja25hbWUoc29jayk7CisJaWYgKGVycikKKwkJZ290byBvdXRfcHV0OworCisJZXJyID0gc29jay0+b3BzLT5nZXRuYW1lKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcmVzcywgJmxlbiwgMCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfcHV0OworCWVyciA9IG1vdmVfYWRkcl90b191c2VyKCZhZGRyZXNzLCBsZW4sIHVzb2NrYWRkciwgdXNvY2thZGRyX2xlbik7CisKK291dF9wdXQ6CisJZnB1dF9saWdodChzb2NrLT5maWxlLCBmcHV0X25lZWRlZCk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqCUdldCB0aGUgcmVtb3RlIGFkZHJlc3MgKCduYW1lJykgb2YgYSBzb2NrZXQgb2JqZWN0LiBNb3ZlIHRoZSBvYnRhaW5lZAorICoJbmFtZSB0byB1c2VyIHNwYWNlLgorICovCisKK1NZU0NBTExfREVGSU5FMyhnZXRwZWVybmFtZSwgaW50LCBmZCwgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqLCB1c29ja2FkZHIsCisJCWludCBfX3VzZXIgKiwgdXNvY2thZGRyX2xlbikKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHJlc3M7CisJaW50IGxlbiwgZXJyLCBmcHV0X25lZWRlZDsKKworCXNvY2sgPSBzb2NrZmRfbG9va3VwX2xpZ2h0KGZkLCAmZXJyLCAmZnB1dF9uZWVkZWQpOworCWlmIChzb2NrICE9IE5VTEwpIHsKKwkJZXJyID0gc2VjdXJpdHlfc29ja2V0X2dldHBlZXJuYW1lKHNvY2spOworCQlpZiAoZXJyKSB7CisJCQlmcHV0X2xpZ2h0KHNvY2stPmZpbGUsIGZwdXRfbmVlZGVkKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQllcnIgPQorCQkgICAgc29jay0+b3BzLT5nZXRuYW1lKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcmVzcywgJmxlbiwKKwkJCQkgICAgICAgMSk7CisJCWlmICghZXJyKQorCQkJZXJyID0gbW92ZV9hZGRyX3RvX3VzZXIoJmFkZHJlc3MsIGxlbiwgdXNvY2thZGRyLAorCQkJCQkJdXNvY2thZGRyX2xlbik7CisJCWZwdXRfbGlnaHQoc29jay0+ZmlsZSwgZnB1dF9uZWVkZWQpOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJU2VuZCBhIGRhdGFncmFtIHRvIGEgZ2l2ZW4gYWRkcmVzcy4gV2UgbW92ZSB0aGUgYWRkcmVzcyBpbnRvIGtlcm5lbAorICoJc3BhY2UgYW5kIGNoZWNrIHRoZSB1c2VyIHNwYWNlIGRhdGEgYXJlYSBpcyByZWFkYWJsZSBiZWZvcmUgaW52b2tpbmcKKyAqCXRoZSBwcm90b2NvbC4KKyAqLworCitTWVNDQUxMX0RFRklORTYoc2VuZHRvLCBpbnQsIGZkLCB2b2lkIF9fdXNlciAqLCBidWZmLCBzaXplX3QsIGxlbiwKKwkJdW5zaWduZWQsIGZsYWdzLCBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICosIGFkZHIsCisJCWludCwgYWRkcl9sZW4pCit7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyZXNzOworCWludCBlcnI7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IGlvdmVjIGlvdjsKKwlpbnQgZnB1dF9uZWVkZWQ7CisKKwlpZiAobGVuID4gSU5UX01BWCkKKwkJbGVuID0gSU5UX01BWDsKKwlzb2NrID0gc29ja2ZkX2xvb2t1cF9saWdodChmZCwgJmVyciwgJmZwdXRfbmVlZGVkKTsKKwlpZiAoIXNvY2spCisJCWdvdG8gb3V0OworCisJaW92Lmlvdl9iYXNlID0gYnVmZjsKKwlpb3YuaW92X2xlbiA9IGxlbjsKKwltc2cubXNnX25hbWUgPSBOVUxMOworCW1zZy5tc2dfaW92ID0gJmlvdjsKKwltc2cubXNnX2lvdmxlbiA9IDE7CisJbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfbmFtZWxlbiA9IDA7CisJaWYgKGFkZHIpIHsKKwkJZXJyID0gbW92ZV9hZGRyX3RvX2tlcm5lbChhZGRyLCBhZGRyX2xlbiwgJmFkZHJlc3MpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0X3B1dDsKKwkJbXNnLm1zZ19uYW1lID0gKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyZXNzOworCQltc2cubXNnX25hbWVsZW4gPSBhZGRyX2xlbjsKKwl9CisJaWYgKHNvY2stPmZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQlmbGFncyB8PSBNU0dfRE9OVFdBSVQ7CisJbXNnLm1zZ19mbGFncyA9IGZsYWdzOworCWVyciA9IHNvY2tfc2VuZG1zZyhzb2NrLCAmbXNnLCBsZW4pOworCitvdXRfcHV0OgorCWZwdXRfbGlnaHQoc29jay0+ZmlsZSwgZnB1dF9uZWVkZWQpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKglTZW5kIGEgZGF0YWdyYW0gZG93biBhIHNvY2tldC4KKyAqLworCitTWVNDQUxMX0RFRklORTQoc2VuZCwgaW50LCBmZCwgdm9pZCBfX3VzZXIgKiwgYnVmZiwgc2l6ZV90LCBsZW4sCisJCXVuc2lnbmVkLCBmbGFncykKK3sKKwlyZXR1cm4gc3lzX3NlbmR0byhmZCwgYnVmZiwgbGVuLCBmbGFncywgTlVMTCwgMCk7Cit9CisKK1NZU0NBTExfREVGSU5FNChteXNlbmQsIGludCwgZmQsIHZvaWQgX191c2VyICosIGJ1ZmYsIHNpemVfdCwgbGVuLAorCQl1bnNpZ25lZCwgZmxhZ3MpCit7CisJcmV0dXJuIHN5c19teXNlbmR0byhmZCwgYnVmZiwgbGVuLCBmbGFncywgTlVMTCwgMCk7Cit9CitFWFBPUlRfU1lNQk9MKHN5c19teXNlbmQpOworLyoKKyAqCVJlY2VpdmUgYSBmcmFtZSBmcm9tIHRoZSBzb2NrZXQgYW5kIG9wdGlvbmFsbHkgcmVjb3JkIHRoZSBhZGRyZXNzIG9mIHRoZQorICoJc2VuZGVyLiBXZSB2ZXJpZnkgdGhlIGJ1ZmZlcnMgYXJlIHdyaXRhYmxlIGFuZCBpZiBuZWVkZWQgbW92ZSB0aGUKKyAqCXNlbmRlciBhZGRyZXNzIGZyb20ga2VybmVsIHRvIHVzZXIgc3BhY2UuCisgKi8KKworU1lTQ0FMTF9ERUZJTkU2KHJlY3Zmcm9tLCBpbnQsIGZkLCB2b2lkIF9fdXNlciAqLCB1YnVmLCBzaXplX3QsIHNpemUsCisJCXVuc2lnbmVkLCBmbGFncywgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqLCBhZGRyLAorCQlpbnQgX191c2VyICosIGFkZHJfbGVuKQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisJc3RydWN0IGlvdmVjIGlvdjsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyZXNzOworCWludCBlcnIsIGVycjI7CisJaW50IGZwdXRfbmVlZGVkOworCisJaWYgKHNpemUgPiBJTlRfTUFYKQorCQlzaXplID0gSU5UX01BWDsKKwlzb2NrID0gc29ja2ZkX2xvb2t1cF9saWdodChmZCwgJmVyciwgJmZwdXRfbmVlZGVkKTsKKwlpZiAoIXNvY2spCisJCWdvdG8gb3V0OworCisJbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfaW92bGVuID0gMTsKKwltc2cubXNnX2lvdiA9ICZpb3Y7CisJaW92Lmlvdl9sZW4gPSBzaXplOworCWlvdi5pb3ZfYmFzZSA9IHVidWY7CisJLyogU2F2ZSBzb21lIGN5Y2xlcyBhbmQgZG9uJ3QgY29weSB0aGUgYWRkcmVzcyBpZiBub3QgbmVlZGVkICovCisJbXNnLm1zZ19uYW1lID0gYWRkciA/IChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcmVzcyA6IE5VTEw7CisJLyogV2UgYXNzdW1lIGFsbCBrZXJuZWwgY29kZSBrbm93cyB0aGUgc2l6ZSBvZiBzb2NrYWRkcl9zdG9yYWdlICovCisJbXNnLm1zZ19uYW1lbGVuID0gMDsKKwlpZiAoc29jay0+ZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCWZsYWdzIHw9IE1TR19ET05UV0FJVDsKKwllcnIgPSBzb2NrX3JlY3Ztc2coc29jaywgJm1zZywgc2l6ZSwgZmxhZ3MpOworCisJaWYgKGVyciA+PSAwICYmIGFkZHIgIT0gTlVMTCkgeworCQllcnIyID0gbW92ZV9hZGRyX3RvX3VzZXIoJmFkZHJlc3MsCisJCQkJCSBtc2cubXNnX25hbWVsZW4sIGFkZHIsIGFkZHJfbGVuKTsKKwkJaWYgKGVycjIgPCAwKQorCQkJZXJyID0gZXJyMjsKKwl9CisKKwlmcHV0X2xpZ2h0KHNvY2stPmZpbGUsIGZwdXRfbmVlZGVkKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJUmVjZWl2ZSBhIGRhdGFncmFtIGZyb20gYSBzb2NrZXQuCisgKi8KKworYXNtbGlua2FnZSBsb25nIHN5c19yZWN2KGludCBmZCwgdm9pZCBfX3VzZXIgKnVidWYsIHNpemVfdCBzaXplLAorCQkJIHVuc2lnbmVkIGZsYWdzKQoreworCXJldHVybiBzeXNfcmVjdmZyb20oZmQsIHVidWYsIHNpemUsIGZsYWdzLCBOVUxMLCBOVUxMKTsKK30KKworLyoKKyAqCVNldCBhIHNvY2tldCBvcHRpb24uIEJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgb3B0aW9uIGxlbmd0aHMgd2UgaGF2ZQorICoJdG8gcGFzcyB0aGUgdXNlciBtb2RlIHBhcmFtZXRlciBmb3IgdGhlIHByb3RvY29scyB0byBzb3J0IG91dC4KKyAqLworCitTWVNDQUxMX0RFRklORTUoc2V0c29ja29wdCwgaW50LCBmZCwgaW50LCBsZXZlbCwgaW50LCBvcHRuYW1lLAorCQljaGFyIF9fdXNlciAqLCBvcHR2YWwsIGludCwgb3B0bGVuKQoreworCWludCBlcnIsIGZwdXRfbmVlZGVkOworCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisKKwlpZiAob3B0bGVuIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzb2NrID0gc29ja2ZkX2xvb2t1cF9saWdodChmZCwgJmVyciwgJmZwdXRfbmVlZGVkKTsKKwlpZiAoc29jayAhPSBOVUxMKSB7CisJCWVyciA9IHNlY3VyaXR5X3NvY2tldF9zZXRzb2Nrb3B0KHNvY2ssIGxldmVsLCBvcHRuYW1lKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X3B1dDsKKworCQlpZiAobGV2ZWwgPT0gU09MX1NPQ0tFVCkKKwkJCWVyciA9CisJCQkgICAgc29ja19zZXRzb2Nrb3B0KHNvY2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsCisJCQkJCSAgICBvcHRsZW4pOworCQllbHNlCisJCQllcnIgPQorCQkJICAgIHNvY2stPm9wcy0+c2V0c29ja29wdChzb2NrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLAorCQkJCQkJICBvcHRsZW4pOworb3V0X3B1dDoKKwkJZnB1dF9saWdodChzb2NrLT5maWxlLCBmcHV0X25lZWRlZCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKglHZXQgYSBzb2NrZXQgb3B0aW9uLiBCZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIG9wdGlvbiBsZW5ndGhzIHdlIGhhdmUKKyAqCXRvIHBhc3MgYSB1c2VyIG1vZGUgcGFyYW1ldGVyIGZvciB0aGUgcHJvdG9jb2xzIHRvIHNvcnQgb3V0LgorICovCisKK1NZU0NBTExfREVGSU5FNShnZXRzb2Nrb3B0LCBpbnQsIGZkLCBpbnQsIGxldmVsLCBpbnQsIG9wdG5hbWUsCisJCWNoYXIgX191c2VyICosIG9wdHZhbCwgaW50IF9fdXNlciAqLCBvcHRsZW4pCit7CisJaW50IGVyciwgZnB1dF9uZWVkZWQ7CisJc3RydWN0IHNvY2tldCAqc29jazsKKworCXNvY2sgPSBzb2NrZmRfbG9va3VwX2xpZ2h0KGZkLCAmZXJyLCAmZnB1dF9uZWVkZWQpOworCWlmIChzb2NrICE9IE5VTEwpIHsKKwkJZXJyID0gc2VjdXJpdHlfc29ja2V0X2dldHNvY2tvcHQoc29jaywgbGV2ZWwsIG9wdG5hbWUpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfcHV0OworCisJCWlmIChsZXZlbCA9PSBTT0xfU09DS0VUKQorCQkJZXJyID0KKwkJCSAgICBzb2NrX2dldHNvY2tvcHQoc29jaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwKKwkJCQkJICAgIG9wdGxlbik7CisJCWVsc2UKKwkJCWVyciA9CisJCQkgICAgc29jay0+b3BzLT5nZXRzb2Nrb3B0KHNvY2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsCisJCQkJCQkgIG9wdGxlbik7CitvdXRfcHV0OgorCQlmcHV0X2xpZ2h0KHNvY2stPmZpbGUsIGZwdXRfbmVlZGVkKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqCVNodXRkb3duIGEgc29ja2V0LgorICovCisKK1NZU0NBTExfREVGSU5FMihzaHV0ZG93biwgaW50LCBmZCwgaW50LCBob3cpCit7CisJaW50IGVyciwgZnB1dF9uZWVkZWQ7CisJc3RydWN0IHNvY2tldCAqc29jazsKKworCXNvY2sgPSBzb2NrZmRfbG9va3VwX2xpZ2h0KGZkLCAmZXJyLCAmZnB1dF9uZWVkZWQpOworCWlmIChzb2NrICE9IE5VTEwpIHsKKwkJZXJyID0gc2VjdXJpdHlfc29ja2V0X3NodXRkb3duKHNvY2ssIGhvdyk7CisJCWlmICghZXJyKQorCQkJZXJyID0gc29jay0+b3BzLT5zaHV0ZG93bihzb2NrLCBob3cpOworCQlmcHV0X2xpZ2h0KHNvY2stPmZpbGUsIGZwdXRfbmVlZGVkKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyogQSBjb3VwbGUgb2YgaGVscGZ1bCBtYWNyb3MgZm9yIGdldHRpbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIDMyLzY0IGJpdAorICogZmllbGRzIHdoaWNoIGFyZSB0aGUgc2FtZSB0eXBlIChpbnQgLyB1bnNpZ25lZCkgb24gb3VyIHBsYXRmb3Jtcy4KKyAqLworCitzdHJ1Y3QgdXNlZF9hZGRyZXNzIHsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBuYW1lOworCXVuc2lnbmVkIGludCBuYW1lX2xlbjsKK307CisKK3N0YXRpYyBpbnQgY29weV9tc2doZHJfZnJvbV91c2VyKHN0cnVjdCBtc2doZHIgKmttc2csCisJCQkJIHN0cnVjdCBtc2doZHIgX191c2VyICp1bXNnKQoreworCWlmIChjb3B5X2Zyb21fdXNlcihrbXNnLCB1bXNnLCBzaXplb2Yoc3RydWN0IG1zZ2hkcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChrbXNnLT5tc2dfbmFtZSA9PSBOVUxMKQorCQlrbXNnLT5tc2dfbmFtZWxlbiA9IDA7CisKKwlpZiAoa21zZy0+bXNnX25hbWVsZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChrbXNnLT5tc2dfbmFtZWxlbiA+IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSkpCisJCWttc2ctPm1zZ19uYW1lbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX19zeXNfbXlzZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgX191c2VyICptc2csCisJCQkgIHN0cnVjdCBtc2doZHIgKm1zZ19zeXMsIHVuc2lnbmVkIGZsYWdzLAorCQkJICBzdHJ1Y3QgdXNlZF9hZGRyZXNzICp1c2VkX2FkZHJlc3MpCit7CisJc3RydWN0IGNvbXBhdF9tc2doZHIgX191c2VyICptc2dfY29tcGF0ID0KKwkgICAgKHN0cnVjdCBjb21wYXRfbXNnaGRyIF9fdXNlciAqKW1zZzsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyZXNzOworCXN0cnVjdCBpb3ZlYyBpb3ZzdGFja1tVSU9fRkFTVElPVl0sICppb3YgPSBpb3ZzdGFjazsKKwl1bnNpZ25lZCBjaGFyIGN0bFtzaXplb2Yoc3RydWN0IGNtc2doZHIpICsgMjBdCisJICAgIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKHNpemVvZihfX2tlcm5lbF9zaXplX3QpKSkpOworCS8qIDIwIGlzIHNpemUgb2YgaXB2Nl9wa3RpbmZvICovCisJdW5zaWduZWQgY2hhciAqY3RsX2J1ZiA9IGN0bDsKKwlpbnQgZXJyLCBjdGxfbGVuLCBpb3Zfc2l6ZSwgdG90YWxfbGVuOworCisJZXJyID0gLUVGQVVMVDsKKwlpZiAoTVNHX0NNU0dfQ09NUEFUICYgZmxhZ3MpCisJCWVyciA9IGdldF9jb21wYXRfbXNnaGRyKG1zZ19zeXMsIG1zZ19jb21wYXQpOworCWVsc2UKKwkJZXJyID0gbXljb3B5X21zZ2hkcl9mcm9tX3VzZXIobXNnX3N5cywgbXNnKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogZG8gbm90IG1vdmUgYmVmb3JlIG1zZ19zeXMgaXMgdmFsaWQgKi8KKwllcnIgPSAtRU1TR1NJWkU7CisJaWYgKG1zZ19zeXMtPm1zZ19pb3ZsZW4gPiBVSU9fTUFYSU9WKQorCQlnb3RvIG91dDsKKworCS8qIENoZWNrIHdoZXRoZXIgdG8gYWxsb2NhdGUgdGhlIGlvdmVjIGFyZWEgKi8KKwllcnIgPSAtRU5PTUVNOworCWlvdl9zaXplID0gbXNnX3N5cy0+bXNnX2lvdmxlbiAqIHNpemVvZihzdHJ1Y3QgaW92ZWMpOworCWlmIChtc2dfc3lzLT5tc2dfaW92bGVuID4gVUlPX0ZBU1RJT1YpIHsKKwkJaW92ID0gc29ja19rbWFsbG9jKHNvY2stPnNrLCBpb3Zfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaW92KQorCQkJZ290byBvdXQ7CisJfQorCisJLyogVGhpcyB3aWxsIGFsc28gbW92ZSB0aGUgYWRkcmVzcyBkYXRhIGludG8ga2VybmVsIHNwYWNlICovCisJaWYgKE1TR19DTVNHX0NPTVBBVCAmIGZsYWdzKSB7CisJCWVyciA9IHZlcmlmeV9jb21wYXRfaW92ZWMobXNnX3N5cywgaW92LCAmYWRkcmVzcywgVkVSSUZZX1JFQUQpOworCX0gZWxzZQorCQllcnIgPSB2ZXJpZnlfaW92ZWMobXNnX3N5cywgaW92LCAmYWRkcmVzcywgVkVSSUZZX1JFQUQpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9mcmVlaW92OworCXRvdGFsX2xlbiA9IGVycjsKKworCWVyciA9IC1FTk9CVUZTOworCisJaWYgKG1zZ19zeXMtPm1zZ19jb250cm9sbGVuID4gSU5UX01BWCkKKwkJZ290byBvdXRfZnJlZWlvdjsKKwljdGxfbGVuID0gbXNnX3N5cy0+bXNnX2NvbnRyb2xsZW47CisJaWYgKChNU0dfQ01TR19DT01QQVQgJiBmbGFncykgJiYgY3RsX2xlbikgeworCQllcnIgPQorCQkgICAgY21zZ2hkcl9mcm9tX3VzZXJfY29tcGF0X3RvX2tlcm4obXNnX3N5cywgc29jay0+c2ssIGN0bCwKKwkJCQkJCSAgICAgc2l6ZW9mKGN0bCkpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfZnJlZWlvdjsKKwkJY3RsX2J1ZiA9IG1zZ19zeXMtPm1zZ19jb250cm9sOworCQljdGxfbGVuID0gbXNnX3N5cy0+bXNnX2NvbnRyb2xsZW47CisJfSBlbHNlIGlmIChjdGxfbGVuKSB7CisJCWlmIChjdGxfbGVuID4gc2l6ZW9mKGN0bCkpIHsKKwkJCWN0bF9idWYgPSBzb2NrX2ttYWxsb2Moc29jay0+c2ssIGN0bF9sZW4sIEdGUF9LRVJORUwpOworCQkJaWYgKGN0bF9idWYgPT0gTlVMTCkKKwkJCQlnb3RvIG91dF9mcmVlaW92OworCQl9CisJCWVyciA9IC1FRkFVTFQ7CisJCS8qCisJCSAqIENhcmVmdWwhIEJlZm9yZSB0aGlzLCBtc2dfc3lzLT5tc2dfY29udHJvbCBjb250YWlucyBhIHVzZXIgcG9pbnRlci4KKwkJICogQWZ0ZXJ3YXJkcywgaXQgd2lsbCBiZSBhIGtlcm5lbCBwb2ludGVyLiBUaHVzIHRoZSBjb21waWxlci1hc3Npc3RlZAorCQkgKiBjaGVja2luZyBmYWxscyBkb3duIG9uIHRoaXMuCisJCSAqLworCQlpZiAoIW1lbWNweShjdGxfYnVmLAorCQkJCSAgICh2b2lkIF9fdXNlciBfX2ZvcmNlICopbXNnX3N5cy0+bXNnX2NvbnRyb2wsCisJCQkJICAgY3RsX2xlbikpCisJCQlnb3RvIG91dF9mcmVlY3RsOworCQltc2dfc3lzLT5tc2dfY29udHJvbCA9IGN0bF9idWY7CisJfQorCW1zZ19zeXMtPm1zZ19mbGFncyA9IGZsYWdzOworCisJaWYgKHNvY2stPmZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQltc2dfc3lzLT5tc2dfZmxhZ3MgfD0gTVNHX0RPTlRXQUlUOworCS8qCisJICogSWYgdGhpcyBpcyBzZW5kbW1zZygpIGFuZCBjdXJyZW50IGRlc3RpbmF0aW9uIGFkZHJlc3MgaXMgc2FtZSBhcworCSAqIHByZXZpb3VzbHkgc3VjY2VlZGVkIGFkZHJlc3MsIG9taXQgYXNraW5nIExTTSdzIGRlY2lzaW9uLgorCSAqIHVzZWRfYWRkcmVzcy0+bmFtZV9sZW4gaXMgaW5pdGlhbGl6ZWQgdG8gVUlOVF9NQVggc28gdGhhdCB0aGUgZmlyc3QKKwkgKiBkZXN0aW5hdGlvbiBhZGRyZXNzIG5ldmVyIG1hdGNoZXMuCisJICovCisJaWYgKHVzZWRfYWRkcmVzcyAmJiBtc2dfc3lzLT5tc2dfbmFtZSAmJgorCSAgICB1c2VkX2FkZHJlc3MtPm5hbWVfbGVuID09IG1zZ19zeXMtPm1zZ19uYW1lbGVuICYmCisJICAgICFtZW1jbXAoJnVzZWRfYWRkcmVzcy0+bmFtZSwgbXNnX3N5cy0+bXNnX25hbWUsCisJCSAgICB1c2VkX2FkZHJlc3MtPm5hbWVfbGVuKSkgeworCQllcnIgPSBzb2NrX3NlbmRtc2dfbm9zZWMoc29jaywgbXNnX3N5cywgdG90YWxfbGVuKTsKKwkJZ290byBvdXRfZnJlZWN0bDsKKwl9CisJZXJyID0gc29ja19zZW5kbXNnKHNvY2ssIG1zZ19zeXMsIHRvdGFsX2xlbik7CisJLyoKKwkgKiBJZiB0aGlzIGlzIHNlbmRtbXNnKCkgYW5kIHNlbmRpbmcgdG8gY3VycmVudCBkZXN0aW5hdGlvbiBhZGRyZXNzIHdhcworCSAqIHN1Y2Nlc3NmdWwsIHJlbWVtYmVyIGl0LgorCSAqLworCWlmICh1c2VkX2FkZHJlc3MgJiYgZXJyID49IDApIHsKKwkJdXNlZF9hZGRyZXNzLT5uYW1lX2xlbiA9IG1zZ19zeXMtPm1zZ19uYW1lbGVuOworCQlpZiAobXNnX3N5cy0+bXNnX25hbWUpCisJCQltZW1jcHkoJnVzZWRfYWRkcmVzcy0+bmFtZSwgbXNnX3N5cy0+bXNnX25hbWUsCisJCQkgICAgICAgdXNlZF9hZGRyZXNzLT5uYW1lX2xlbik7CisJfQorCitvdXRfZnJlZWN0bDoKKwlpZiAoY3RsX2J1ZiAhPSBjdGwpCisJCXNvY2tfa2ZyZWVfcyhzb2NrLT5zaywgY3RsX2J1ZiwgY3RsX2xlbik7CitvdXRfZnJlZWlvdjoKKwlpZiAoaW92ICE9IGlvdnN0YWNrKQorCQlzb2NrX2tmcmVlX3Moc29jay0+c2ssIGlvdiwgaW92X3NpemUpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK2ludCBfX3N5c19teXNlbmRtbXNnKGludCBmZCwgc3RydWN0IG1tc2doZHIgX191c2VyICptbXNnLCB1bnNpZ25lZCBpbnQgdmxlbiwKKwkJICAgdW5zaWduZWQgaW50IGZsYWdzKQoreworCWludCBmcHV0X25lZWRlZCwgZXJyLCBkYXRhZ3JhbXM7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwlzdHJ1Y3QgbW1zZ2hkciBfX3VzZXIgKmVudHJ5OworCXN0cnVjdCBjb21wYXRfbW1zZ2hkciBfX3VzZXIgKmNvbXBhdF9lbnRyeTsKKwlzdHJ1Y3QgbXNnaGRyIG1zZ19zeXM7CisJc3RydWN0IHVzZWRfYWRkcmVzcyB1c2VkX2FkZHJlc3M7CisKKwlpZiAodmxlbiA+IFVJT19NQVhJT1YpCisJCXZsZW4gPSBVSU9fTUFYSU9WOworCisJZGF0YWdyYW1zID0gMDsKKworCXNvY2sgPSBzb2NrZmRfbG9va3VwX2xpZ2h0KGZkLCAmZXJyLCAmZnB1dF9uZWVkZWQpOworCWlmICghc29jaykKKwkJcmV0dXJuIGVycjsKKworCXVzZWRfYWRkcmVzcy5uYW1lX2xlbiA9IFVJTlRfTUFYOworCWVudHJ5ID0gbW1zZzsKKwljb21wYXRfZW50cnkgPSAoc3RydWN0IGNvbXBhdF9tbXNnaGRyIF9fdXNlciAqKW1tc2c7CisJZXJyID0gMDsKKworCXdoaWxlIChkYXRhZ3JhbXMgPCB2bGVuKSB7CisJCWlmIChNU0dfQ01TR19DT01QQVQgJiBmbGFncykgeworCQkJZXJyID0gX19fc3lzX215c2VuZG1zZyhzb2NrLCAoc3RydWN0IG1zZ2hkciBfX3VzZXIgKiljb21wYXRfZW50cnksCisJCQkJCSAgICAgJm1zZ19zeXMsIGZsYWdzLCAmdXNlZF9hZGRyZXNzKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWJyZWFrOworCQkJZXJyID0gbXlwdXRfdXNlcihlcnIsICZjb21wYXRfZW50cnktPm1zZ19sZW4pOworCQkJKytjb21wYXRfZW50cnk7CisJCX0gZWxzZSB7CisJCQllcnIgPSBfX19zeXNfbXlzZW5kbXNnKHNvY2ssCisJCQkJCSAgICAgKHN0cnVjdCBtc2doZHIgX191c2VyICopZW50cnksCisJCQkJCSAgICAgJm1zZ19zeXMsIGZsYWdzLCAmdXNlZF9hZGRyZXNzKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWJyZWFrOworCQkJZXJyID0gbXlwdXRfdXNlcihlcnIsICZlbnRyeS0+bXNnX2xlbik7CisJCQkrK2VudHJ5OworCQl9CisKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCQkrK2RhdGFncmFtczsKKwl9CisKKwlmcHV0X2xpZ2h0KHNvY2stPmZpbGUsIGZwdXRfbmVlZGVkKTsKKworCS8qIFdlIG9ubHkgcmV0dXJuIGFuIGVycm9yIGlmIG5vIGRhdGFncmFtcyB3ZXJlIGFibGUgdG8gYmUgc2VudCAqLworCWlmIChkYXRhZ3JhbXMgIT0gMCkKKwkJcmV0dXJuIGRhdGFncmFtczsKKworCXJldHVybiBlcnI7Cit9CisKKworU1lTQ0FMTF9ERUZJTkU0KG15c2VuZG1tc2csIGludCwgZmQsIHN0cnVjdCBtbXNnaGRyIF9fdXNlciAqLCBtbXNnLAorCQl1bnNpZ25lZCBpbnQsIHZsZW4sIHVuc2lnbmVkIGludCwgZmxhZ3MpCit7CisJaWYgKGZsYWdzICYgTVNHX0NNU0dfQ09NUEFUKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gX19zeXNfbXlzZW5kbW1zZyhmZCwgbW1zZywgdmxlbiwgZmxhZ3MpOworfQorCitsb25nIF9fc3lzX215c2VuZG1zZyhpbnQgZmQsIHN0cnVjdCBtc2doZHIgX191c2VyICptc2csIHVuc2lnbmVkIGZsYWdzKQoreworCWludCBmcHV0X25lZWRlZCwgZXJyOworCXN0cnVjdCBtc2doZHIgbXNnX3N5czsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCisJc29jayA9IHNvY2tmZF9sb29rdXBfbGlnaHQoZmQsICZlcnIsICZmcHV0X25lZWRlZCk7CisJaWYgKCFzb2NrKQorCQlnb3RvIG91dDsKKworCWVyciA9IF9fX3N5c19teXNlbmRtc2coc29jaywgbXNnLCAmbXNnX3N5cywgZmxhZ3MsIE5VTEwpOworCisJZnB1dF9saWdodChzb2NrLT5maWxlLCBmcHV0X25lZWRlZCk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworU1lTQ0FMTF9ERUZJTkUzKG15c2VuZG1zZywgaW50LCBmZCwgc3RydWN0IG1zZ2hkciBfX3VzZXIgKiwgbXNnLCB1bnNpZ25lZCBpbnQsIGZsYWdzKQoreworCWlmIChmbGFncyAmIE1TR19DTVNHX0NPTVBBVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIF9fc3lzX215c2VuZG1zZyhmZCwgbXNnLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgX19fc3lzX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciBfX3VzZXIgKm1zZywKKwkJCSAgc3RydWN0IG1zZ2hkciAqbXNnX3N5cywgdW5zaWduZWQgZmxhZ3MsCisJCQkgIHN0cnVjdCB1c2VkX2FkZHJlc3MgKnVzZWRfYWRkcmVzcykKK3sKKwlzdHJ1Y3QgY29tcGF0X21zZ2hkciBfX3VzZXIgKm1zZ19jb21wYXQgPQorCSAgICAoc3RydWN0IGNvbXBhdF9tc2doZHIgX191c2VyICopbXNnOworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHJlc3M7CisJc3RydWN0IGlvdmVjIGlvdnN0YWNrW1VJT19GQVNUSU9WXSwgKmlvdiA9IGlvdnN0YWNrOworCXVuc2lnbmVkIGNoYXIgY3RsW3NpemVvZihzdHJ1Y3QgY21zZ2hkcikgKyAyMF0KKwkgICAgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoc2l6ZW9mKF9fa2VybmVsX3NpemVfdCkpKSk7CisJLyogMjAgaXMgc2l6ZSBvZiBpcHY2X3BrdGluZm8gKi8KKwl1bnNpZ25lZCBjaGFyICpjdGxfYnVmID0gY3RsOworCWludCBlcnIsIGN0bF9sZW4sIGlvdl9zaXplLCB0b3RhbF9sZW47CisKKwllcnIgPSAtRUZBVUxUOworCWlmIChNU0dfQ01TR19DT01QQVQgJiBmbGFncykKKwkJZXJyID0gZ2V0X2NvbXBhdF9tc2doZHIobXNnX3N5cywgbXNnX2NvbXBhdCk7CisJZWxzZQorCQllcnIgPSBjb3B5X21zZ2hkcl9mcm9tX3VzZXIobXNnX3N5cywgbXNnKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogZG8gbm90IG1vdmUgYmVmb3JlIG1zZ19zeXMgaXMgdmFsaWQgKi8KKwllcnIgPSAtRU1TR1NJWkU7CisJaWYgKG1zZ19zeXMtPm1zZ19pb3ZsZW4gPiBVSU9fTUFYSU9WKQorCQlnb3RvIG91dDsKKworCS8qIENoZWNrIHdoZXRoZXIgdG8gYWxsb2NhdGUgdGhlIGlvdmVjIGFyZWEgKi8KKwllcnIgPSAtRU5PTUVNOworCWlvdl9zaXplID0gbXNnX3N5cy0+bXNnX2lvdmxlbiAqIHNpemVvZihzdHJ1Y3QgaW92ZWMpOworCWlmIChtc2dfc3lzLT5tc2dfaW92bGVuID4gVUlPX0ZBU1RJT1YpIHsKKwkJaW92ID0gc29ja19rbWFsbG9jKHNvY2stPnNrLCBpb3Zfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaW92KQorCQkJZ290byBvdXQ7CisJfQorCisJLyogVGhpcyB3aWxsIGFsc28gbW92ZSB0aGUgYWRkcmVzcyBkYXRhIGludG8ga2VybmVsIHNwYWNlICovCisJaWYgKE1TR19DTVNHX0NPTVBBVCAmIGZsYWdzKSB7CisJCWVyciA9IHZlcmlmeV9jb21wYXRfaW92ZWMobXNnX3N5cywgaW92LCAmYWRkcmVzcywgVkVSSUZZX1JFQUQpOworCX0gZWxzZQorCQllcnIgPSB2ZXJpZnlfaW92ZWMobXNnX3N5cywgaW92LCAmYWRkcmVzcywgVkVSSUZZX1JFQUQpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9mcmVlaW92OworCXRvdGFsX2xlbiA9IGVycjsKKworCWVyciA9IC1FTk9CVUZTOworCisJaWYgKG1zZ19zeXMtPm1zZ19jb250cm9sbGVuID4gSU5UX01BWCkKKwkJZ290byBvdXRfZnJlZWlvdjsKKwljdGxfbGVuID0gbXNnX3N5cy0+bXNnX2NvbnRyb2xsZW47CisJaWYgKChNU0dfQ01TR19DT01QQVQgJiBmbGFncykgJiYgY3RsX2xlbikgeworCQllcnIgPQorCQkgICAgY21zZ2hkcl9mcm9tX3VzZXJfY29tcGF0X3RvX2tlcm4obXNnX3N5cywgc29jay0+c2ssIGN0bCwKKwkJCQkJCSAgICAgc2l6ZW9mKGN0bCkpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfZnJlZWlvdjsKKwkJY3RsX2J1ZiA9IG1zZ19zeXMtPm1zZ19jb250cm9sOworCQljdGxfbGVuID0gbXNnX3N5cy0+bXNnX2NvbnRyb2xsZW47CisJfSBlbHNlIGlmIChjdGxfbGVuKSB7CisJCWlmIChjdGxfbGVuID4gc2l6ZW9mKGN0bCkpIHsKKwkJCWN0bF9idWYgPSBzb2NrX2ttYWxsb2Moc29jay0+c2ssIGN0bF9sZW4sIEdGUF9LRVJORUwpOworCQkJaWYgKGN0bF9idWYgPT0gTlVMTCkKKwkJCQlnb3RvIG91dF9mcmVlaW92OworCQl9CisJCWVyciA9IC1FRkFVTFQ7CisJCS8qCisJCSAqIENhcmVmdWwhIEJlZm9yZSB0aGlzLCBtc2dfc3lzLT5tc2dfY29udHJvbCBjb250YWlucyBhIHVzZXIgcG9pbnRlci4KKwkJICogQWZ0ZXJ3YXJkcywgaXQgd2lsbCBiZSBhIGtlcm5lbCBwb2ludGVyLiBUaHVzIHRoZSBjb21waWxlci1hc3Npc3RlZAorCQkgKiBjaGVja2luZyBmYWxscyBkb3duIG9uIHRoaXMuCisJCSAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoY3RsX2J1ZiwKKwkJCQkgICAodm9pZCBfX3VzZXIgX19mb3JjZSAqKW1zZ19zeXMtPm1zZ19jb250cm9sLAorCQkJCSAgIGN0bF9sZW4pKQorCQkJZ290byBvdXRfZnJlZWN0bDsKKwkJbXNnX3N5cy0+bXNnX2NvbnRyb2wgPSBjdGxfYnVmOworCX0KKwltc2dfc3lzLT5tc2dfZmxhZ3MgPSBmbGFnczsKKworCWlmIChzb2NrLT5maWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJbXNnX3N5cy0+bXNnX2ZsYWdzIHw9IE1TR19ET05UV0FJVDsKKwkvKgorCSAqIElmIHRoaXMgaXMgc2VuZG1tc2coKSBhbmQgY3VycmVudCBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIHNhbWUgYXMKKwkgKiBwcmV2aW91c2x5IHN1Y2NlZWRlZCBhZGRyZXNzLCBvbWl0IGFza2luZyBMU00ncyBkZWNpc2lvbi4KKwkgKiB1c2VkX2FkZHJlc3MtPm5hbWVfbGVuIGlzIGluaXRpYWxpemVkIHRvIFVJTlRfTUFYIHNvIHRoYXQgdGhlIGZpcnN0CisJICogZGVzdGluYXRpb24gYWRkcmVzcyBuZXZlciBtYXRjaGVzLgorCSAqLworCWlmICh1c2VkX2FkZHJlc3MgJiYgbXNnX3N5cy0+bXNnX25hbWUgJiYKKwkgICAgdXNlZF9hZGRyZXNzLT5uYW1lX2xlbiA9PSBtc2dfc3lzLT5tc2dfbmFtZWxlbiAmJgorCSAgICAhbWVtY21wKCZ1c2VkX2FkZHJlc3MtPm5hbWUsIG1zZ19zeXMtPm1zZ19uYW1lLAorCQkgICAgdXNlZF9hZGRyZXNzLT5uYW1lX2xlbikpIHsKKwkJZXJyID0gc29ja19zZW5kbXNnX25vc2VjKHNvY2ssIG1zZ19zeXMsIHRvdGFsX2xlbik7CisJCWdvdG8gb3V0X2ZyZWVjdGw7CisJfQorCWVyciA9IHNvY2tfc2VuZG1zZyhzb2NrLCBtc2dfc3lzLCB0b3RhbF9sZW4pOworCS8qCisJICogSWYgdGhpcyBpcyBzZW5kbW1zZygpIGFuZCBzZW5kaW5nIHRvIGN1cnJlbnQgZGVzdGluYXRpb24gYWRkcmVzcyB3YXMKKwkgKiBzdWNjZXNzZnVsLCByZW1lbWJlciBpdC4KKwkgKi8KKwlpZiAodXNlZF9hZGRyZXNzICYmIGVyciA+PSAwKSB7CisJCXVzZWRfYWRkcmVzcy0+bmFtZV9sZW4gPSBtc2dfc3lzLT5tc2dfbmFtZWxlbjsKKwkJaWYgKG1zZ19zeXMtPm1zZ19uYW1lKQorCQkJbWVtY3B5KCZ1c2VkX2FkZHJlc3MtPm5hbWUsIG1zZ19zeXMtPm1zZ19uYW1lLAorCQkJICAgICAgIHVzZWRfYWRkcmVzcy0+bmFtZV9sZW4pOworCX0KKworb3V0X2ZyZWVjdGw6CisJaWYgKGN0bF9idWYgIT0gY3RsKQorCQlzb2NrX2tmcmVlX3Moc29jay0+c2ssIGN0bF9idWYsIGN0bF9sZW4pOworb3V0X2ZyZWVpb3Y6CisJaWYgKGlvdiAhPSBpb3ZzdGFjaykKKwkJc29ja19rZnJlZV9zKHNvY2stPnNrLCBpb3YsIGlvdl9zaXplKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJQlNEIHNlbmRtc2cgaW50ZXJmYWNlCisgKi8KKworbG9uZyBfX3N5c19zZW5kbXNnKGludCBmZCwgc3RydWN0IG1zZ2hkciBfX3VzZXIgKm1zZywgdW5zaWduZWQgZmxhZ3MpCit7CisJaW50IGZwdXRfbmVlZGVkLCBlcnI7CisJc3RydWN0IG1zZ2hkciBtc2dfc3lzOworCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisKKwlzb2NrID0gc29ja2ZkX2xvb2t1cF9saWdodChmZCwgJmVyciwgJmZwdXRfbmVlZGVkKTsKKwlpZiAoIXNvY2spCisJCWdvdG8gb3V0OworCisJZXJyID0gX19fc3lzX3NlbmRtc2coc29jaywgbXNnLCAmbXNnX3N5cywgZmxhZ3MsIE5VTEwpOworCisJZnB1dF9saWdodChzb2NrLT5maWxlLCBmcHV0X25lZWRlZCk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworU1lTQ0FMTF9ERUZJTkUzKHNlbmRtc2csIGludCwgZmQsIHN0cnVjdCBtc2doZHIgX191c2VyICosIG1zZywgdW5zaWduZWQgaW50LCBmbGFncykKK3sKKwlpZiAoZmxhZ3MgJiBNU0dfQ01TR19DT01QQVQpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBfX3N5c19zZW5kbXNnKGZkLCBtc2csIGZsYWdzKTsKK30KKworLyoKKyAqCUxpbnV4IHNlbmRtbXNnIGludGVyZmFjZQorICovCisKK2ludCBfX3N5c19zZW5kbW1zZyhpbnQgZmQsIHN0cnVjdCBtbXNnaGRyIF9fdXNlciAqbW1zZywgdW5zaWduZWQgaW50IHZsZW4sCisJCSAgIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpbnQgZnB1dF9uZWVkZWQsIGVyciwgZGF0YWdyYW1zOworCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisJc3RydWN0IG1tc2doZHIgX191c2VyICplbnRyeTsKKwlzdHJ1Y3QgY29tcGF0X21tc2doZHIgX191c2VyICpjb21wYXRfZW50cnk7CisJc3RydWN0IG1zZ2hkciBtc2dfc3lzOworCXN0cnVjdCB1c2VkX2FkZHJlc3MgdXNlZF9hZGRyZXNzOworCisJaWYgKHZsZW4gPiBVSU9fTUFYSU9WKQorCQl2bGVuID0gVUlPX01BWElPVjsKKworCWRhdGFncmFtcyA9IDA7CisKKwlzb2NrID0gc29ja2ZkX2xvb2t1cF9saWdodChmZCwgJmVyciwgJmZwdXRfbmVlZGVkKTsKKwlpZiAoIXNvY2spCisJCXJldHVybiBlcnI7CisKKwl1c2VkX2FkZHJlc3MubmFtZV9sZW4gPSBVSU5UX01BWDsKKwllbnRyeSA9IG1tc2c7CisJY29tcGF0X2VudHJ5ID0gKHN0cnVjdCBjb21wYXRfbW1zZ2hkciBfX3VzZXIgKiltbXNnOworCWVyciA9IDA7CisKKwl3aGlsZSAoZGF0YWdyYW1zIDwgdmxlbikgeworCQlpZiAoTVNHX0NNU0dfQ09NUEFUICYgZmxhZ3MpIHsKKwkJCWVyciA9IF9fX3N5c19zZW5kbXNnKHNvY2ssIChzdHJ1Y3QgbXNnaGRyIF9fdXNlciAqKWNvbXBhdF9lbnRyeSwKKwkJCQkJICAgICAmbXNnX3N5cywgZmxhZ3MsICZ1c2VkX2FkZHJlc3MpOworCQkJaWYgKGVyciA8IDApCisJCQkJYnJlYWs7CisJCQllcnIgPSBfX3B1dF91c2VyKGVyciwgJmNvbXBhdF9lbnRyeS0+bXNnX2xlbik7CisJCQkrK2NvbXBhdF9lbnRyeTsKKwkJfSBlbHNlIHsKKwkJCWVyciA9IF9fX3N5c19zZW5kbXNnKHNvY2ssCisJCQkJCSAgICAgKHN0cnVjdCBtc2doZHIgX191c2VyICopZW50cnksCisJCQkJCSAgICAgJm1zZ19zeXMsIGZsYWdzLCAmdXNlZF9hZGRyZXNzKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWJyZWFrOworCQkJZXJyID0gcHV0X3VzZXIoZXJyLCAmZW50cnktPm1zZ19sZW4pOworCQkJKytlbnRyeTsKKwkJfQorCisJCWlmIChlcnIpCisJCQlicmVhazsKKwkJKytkYXRhZ3JhbXM7CisJfQorCisJZnB1dF9saWdodChzb2NrLT5maWxlLCBmcHV0X25lZWRlZCk7CisKKwkvKiBXZSBvbmx5IHJldHVybiBhbiBlcnJvciBpZiBubyBkYXRhZ3JhbXMgd2VyZSBhYmxlIHRvIGJlIHNlbnQgKi8KKwlpZiAoZGF0YWdyYW1zICE9IDApCisJCXJldHVybiBkYXRhZ3JhbXM7CisKKwlyZXR1cm4gZXJyOworfQorCitTWVNDQUxMX0RFRklORTQoc2VuZG1tc2csIGludCwgZmQsIHN0cnVjdCBtbXNnaGRyIF9fdXNlciAqLCBtbXNnLAorCQl1bnNpZ25lZCBpbnQsIHZsZW4sIHVuc2lnbmVkIGludCwgZmxhZ3MpCit7CisJaWYgKGZsYWdzICYgTVNHX0NNU0dfQ09NUEFUKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gX19zeXNfc2VuZG1tc2coZmQsIG1tc2csIHZsZW4sIGZsYWdzKTsKK30KKworc3RhdGljIGludCBfX19zeXNfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyIF9fdXNlciAqbXNnLAorCQkJICBzdHJ1Y3QgbXNnaGRyICptc2dfc3lzLCB1bnNpZ25lZCBmbGFncywgaW50IG5vc2VjKQoreworCXN0cnVjdCBjb21wYXRfbXNnaGRyIF9fdXNlciAqbXNnX2NvbXBhdCA9CisJICAgIChzdHJ1Y3QgY29tcGF0X21zZ2hkciBfX3VzZXIgKiltc2c7CisJc3RydWN0IGlvdmVjIGlvdnN0YWNrW1VJT19GQVNUSU9WXTsKKwlzdHJ1Y3QgaW92ZWMgKmlvdiA9IGlvdnN0YWNrOworCXVuc2lnbmVkIGxvbmcgY21zZ19wdHI7CisJaW50IGVyciwgaW92X3NpemUsIHRvdGFsX2xlbiwgbGVuOworCisJLyoga2VybmVsIG1vZGUgYWRkcmVzcyAqLworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7CisKKwkvKiB1c2VyIG1vZGUgYWRkcmVzcyBwb2ludGVycyAqLworCXN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKnVhZGRyOworCWludCBfX3VzZXIgKnVhZGRyX2xlbjsKKworCWlmIChNU0dfQ01TR19DT01QQVQgJiBmbGFncykKKwkJZXJyID0gZ2V0X2NvbXBhdF9tc2doZHIobXNnX3N5cywgbXNnX2NvbXBhdCk7CisJZWxzZQorCQllcnIgPSBjb3B5X21zZ2hkcl9mcm9tX3VzZXIobXNnX3N5cywgbXNnKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gLUVNU0dTSVpFOworCWlmIChtc2dfc3lzLT5tc2dfaW92bGVuID4gVUlPX01BWElPVikKKwkJZ290byBvdXQ7CisKKwkvKiBDaGVjayB3aGV0aGVyIHRvIGFsbG9jYXRlIHRoZSBpb3ZlYyBhcmVhICovCisJZXJyID0gLUVOT01FTTsKKwlpb3Zfc2l6ZSA9IG1zZ19zeXMtPm1zZ19pb3ZsZW4gKiBzaXplb2Yoc3RydWN0IGlvdmVjKTsKKwlpZiAobXNnX3N5cy0+bXNnX2lvdmxlbiA+IFVJT19GQVNUSU9WKSB7CisJCWlvdiA9IHNvY2tfa21hbGxvYyhzb2NrLT5zaywgaW92X3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIWlvdikKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIFNhdmUgdGhlIHVzZXItbW9kZSBhZGRyZXNzICh2ZXJpZnlfaW92ZWMgd2lsbCBjaGFuZ2UgdGhlCisJICoga2VybmVsIG1zZ2hkciB0byB1c2UgdGhlIGtlcm5lbCBhZGRyZXNzIHNwYWNlKQorCSAqLworCXVhZGRyID0gKF9fZm9yY2Ugdm9pZCBfX3VzZXIgKiltc2dfc3lzLT5tc2dfbmFtZTsKKwl1YWRkcl9sZW4gPSBDT01QQVRfTkFNRUxFTihtc2cpOworCWlmIChNU0dfQ01TR19DT01QQVQgJiBmbGFncykKKwkJZXJyID0gdmVyaWZ5X2NvbXBhdF9pb3ZlYyhtc2dfc3lzLCBpb3YsICZhZGRyLCBWRVJJRllfV1JJVEUpOworCWVsc2UKKwkJZXJyID0gdmVyaWZ5X2lvdmVjKG1zZ19zeXMsIGlvdiwgJmFkZHIsIFZFUklGWV9XUklURSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X2ZyZWVpb3Y7CisJdG90YWxfbGVuID0gZXJyOworCisJY21zZ19wdHIgPSAodW5zaWduZWQgbG9uZyltc2dfc3lzLT5tc2dfY29udHJvbDsKKwltc2dfc3lzLT5tc2dfZmxhZ3MgPSBmbGFncyAmIChNU0dfQ01TR19DTE9FWEVDfE1TR19DTVNHX0NPTVBBVCk7CisKKwkvKiBXZSBhc3N1bWUgYWxsIGtlcm5lbCBjb2RlIGtub3dzIHRoZSBzaXplIG9mIHNvY2thZGRyX3N0b3JhZ2UgKi8KKwltc2dfc3lzLT5tc2dfbmFtZWxlbiA9IDA7CisKKwlpZiAoc29jay0+ZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCWZsYWdzIHw9IE1TR19ET05UV0FJVDsKKwllcnIgPSAobm9zZWMgPyBzb2NrX3JlY3Ztc2dfbm9zZWMgOiBzb2NrX3JlY3Ztc2cpKHNvY2ssIG1zZ19zeXMsCisJCQkJCQkJICB0b3RhbF9sZW4sIGZsYWdzKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXRfZnJlZWlvdjsKKwlsZW4gPSBlcnI7CisKKwlpZiAodWFkZHIgIT0gTlVMTCkgeworCQllcnIgPSBtb3ZlX2FkZHJfdG9fdXNlcigmYWRkciwKKwkJCQkJbXNnX3N5cy0+bXNnX25hbWVsZW4sIHVhZGRyLAorCQkJCQl1YWRkcl9sZW4pOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0X2ZyZWVpb3Y7CisJfQorCWVyciA9IF9fcHV0X3VzZXIoKG1zZ19zeXMtPm1zZ19mbGFncyAmIH5NU0dfQ01TR19DT01QQVQpLAorCQkJIENPTVBBVF9GTEFHUyhtc2cpKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlaW92OworCWlmIChNU0dfQ01TR19DT01QQVQgJiBmbGFncykKKwkJZXJyID0gX19wdXRfdXNlcigodW5zaWduZWQgbG9uZyltc2dfc3lzLT5tc2dfY29udHJvbCAtIGNtc2dfcHRyLAorCQkJCSAmbXNnX2NvbXBhdC0+bXNnX2NvbnRyb2xsZW4pOworCWVsc2UKKwkJZXJyID0gX19wdXRfdXNlcigodW5zaWduZWQgbG9uZyltc2dfc3lzLT5tc2dfY29udHJvbCAtIGNtc2dfcHRyLAorCQkJCSAmbXNnLT5tc2dfY29udHJvbGxlbik7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZWlvdjsKKwllcnIgPSBsZW47CisKK291dF9mcmVlaW92OgorCWlmIChpb3YgIT0gaW92c3RhY2spCisJCXNvY2tfa2ZyZWVfcyhzb2NrLT5zaywgaW92LCBpb3Zfc2l6ZSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqCUJTRCByZWN2bXNnIGludGVyZmFjZQorICovCisKK2xvbmcgX19zeXNfcmVjdm1zZyhpbnQgZmQsIHN0cnVjdCBtc2doZHIgX191c2VyICptc2csIHVuc2lnbmVkIGZsYWdzKQoreworCWludCBmcHV0X25lZWRlZCwgZXJyOworCXN0cnVjdCBtc2doZHIgbXNnX3N5czsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCisJc29jayA9IHNvY2tmZF9sb29rdXBfbGlnaHQoZmQsICZlcnIsICZmcHV0X25lZWRlZCk7CisJaWYgKCFzb2NrKQorCQlnb3RvIG91dDsKKworCWVyciA9IF9fX3N5c19yZWN2bXNnKHNvY2ssIG1zZywgJm1zZ19zeXMsIGZsYWdzLCAwKTsKKworCWZwdXRfbGlnaHQoc29jay0+ZmlsZSwgZnB1dF9uZWVkZWQpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK1NZU0NBTExfREVGSU5FMyhyZWN2bXNnLCBpbnQsIGZkLCBzdHJ1Y3QgbXNnaGRyIF9fdXNlciAqLCBtc2csCisJCXVuc2lnbmVkIGludCwgZmxhZ3MpCit7CisJaWYgKGZsYWdzICYgTVNHX0NNU0dfQ09NUEFUKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gX19zeXNfcmVjdm1zZyhmZCwgbXNnLCBmbGFncyk7Cit9CisKKy8qCisgKiAgICAgTGludXggcmVjdm1tc2cgaW50ZXJmYWNlCisgKi8KKworaW50IF9fc3lzX3JlY3ZtbXNnKGludCBmZCwgc3RydWN0IG1tc2doZHIgX191c2VyICptbXNnLCB1bnNpZ25lZCBpbnQgdmxlbiwKKwkJICAgdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVvdXQpCit7CisJaW50IGZwdXRfbmVlZGVkLCBlcnIsIGRhdGFncmFtczsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrOworCXN0cnVjdCBtbXNnaGRyIF9fdXNlciAqZW50cnk7CisJc3RydWN0IGNvbXBhdF9tbXNnaGRyIF9fdXNlciAqY29tcGF0X2VudHJ5OworCXN0cnVjdCBtc2doZHIgbXNnX3N5czsKKwlzdHJ1Y3QgdGltZXNwZWMgZW5kX3RpbWU7CisKKwlpZiAodGltZW91dCAmJgorCSAgICBwb2xsX3NlbGVjdF9zZXRfdGltZW91dCgmZW5kX3RpbWUsIHRpbWVvdXQtPnR2X3NlYywKKwkJCQkgICAgdGltZW91dC0+dHZfbnNlYykpCisJCXJldHVybiAtRUlOVkFMOworCisJZGF0YWdyYW1zID0gMDsKKworCXNvY2sgPSBzb2NrZmRfbG9va3VwX2xpZ2h0KGZkLCAmZXJyLCAmZnB1dF9uZWVkZWQpOworCWlmICghc29jaykKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHNvY2tfZXJyb3Ioc29jay0+c2spOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3B1dDsKKworCWVudHJ5ID0gbW1zZzsKKwljb21wYXRfZW50cnkgPSAoc3RydWN0IGNvbXBhdF9tbXNnaGRyIF9fdXNlciAqKW1tc2c7CisKKwl3aGlsZSAoZGF0YWdyYW1zIDwgdmxlbikgeworCQkvKgorCQkgKiBObyBuZWVkIHRvIGFzayBMU00gZm9yIG1vcmUgdGhhbiB0aGUgZmlyc3QgZGF0YWdyYW0uCisJCSAqLworCQlpZiAoTVNHX0NNU0dfQ09NUEFUICYgZmxhZ3MpIHsKKwkJCWVyciA9IF9fX3N5c19yZWN2bXNnKHNvY2ssIChzdHJ1Y3QgbXNnaGRyIF9fdXNlciAqKWNvbXBhdF9lbnRyeSwKKwkJCQkJICAgICAmbXNnX3N5cywgZmxhZ3MgJiB+TVNHX1dBSVRGT1JPTkUsCisJCQkJCSAgICAgZGF0YWdyYW1zKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWJyZWFrOworCQkJZXJyID0gX19wdXRfdXNlcihlcnIsICZjb21wYXRfZW50cnktPm1zZ19sZW4pOworCQkJKytjb21wYXRfZW50cnk7CisJCX0gZWxzZSB7CisJCQllcnIgPSBfX19zeXNfcmVjdm1zZyhzb2NrLAorCQkJCQkgICAgIChzdHJ1Y3QgbXNnaGRyIF9fdXNlciAqKWVudHJ5LAorCQkJCQkgICAgICZtc2dfc3lzLCBmbGFncyAmIH5NU0dfV0FJVEZPUk9ORSwKKwkJCQkJICAgICBkYXRhZ3JhbXMpOworCQkJaWYgKGVyciA8IDApCisJCQkJYnJlYWs7CisJCQllcnIgPSBwdXRfdXNlcihlcnIsICZlbnRyeS0+bXNnX2xlbik7CisJCQkrK2VudHJ5OworCQl9CisKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCQkrK2RhdGFncmFtczsKKworCQkvKiBNU0dfV0FJVEZPUk9ORSB0dXJucyBvbiBNU0dfRE9OVFdBSVQgYWZ0ZXIgb25lIHBhY2tldCAqLworCQlpZiAoZmxhZ3MgJiBNU0dfV0FJVEZPUk9ORSkKKwkJCWZsYWdzIHw9IE1TR19ET05UV0FJVDsKKworCQlpZiAodGltZW91dCkgeworCQkJa3RpbWVfZ2V0X3RzKHRpbWVvdXQpOworCQkJKnRpbWVvdXQgPSB0aW1lc3BlY19zdWIoZW5kX3RpbWUsICp0aW1lb3V0KTsKKwkJCWlmICh0aW1lb3V0LT50dl9zZWMgPCAwKSB7CisJCQkJdGltZW91dC0+dHZfc2VjID0gdGltZW91dC0+dHZfbnNlYyA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIFRpbWVvdXQsIHJldHVybiBsZXNzIHRoYW4gdmxlbiBkYXRhZ3JhbXMgKi8KKwkJCWlmICh0aW1lb3V0LT50dl9uc2VjID09IDAgJiYgdGltZW91dC0+dHZfc2VjID09IDApCisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBPdXQgb2YgYmFuZCBkYXRhLCByZXR1cm4gcmlnaHQgYXdheSAqLworCQlpZiAobXNnX3N5cy5tc2dfZmxhZ3MgJiBNU0dfT09CKQorCQkJYnJlYWs7CisJfQorCitvdXRfcHV0OgorCWZwdXRfbGlnaHQoc29jay0+ZmlsZSwgZnB1dF9uZWVkZWQpOworCisJaWYgKGVyciA9PSAwKQorCQlyZXR1cm4gZGF0YWdyYW1zOworCisJaWYgKGRhdGFncmFtcyAhPSAwKSB7CisJCS8qCisJCSAqIFdlIG1heSByZXR1cm4gbGVzcyBlbnRyaWVzIHRoYW4gcmVxdWVzdGVkICh2bGVuKSBpZiB0aGUKKwkJICogc29jayBpcyBub24gYmxvY2sgYW5kIHRoZXJlIGFyZW4ndCBlbm91Z2ggZGF0YWdyYW1zLi4uCisJCSAqLworCQlpZiAoZXJyICE9IC1FQUdBSU4pIHsKKwkJCS8qCisJCQkgKiAuLi4gb3IgIGlmIHJlY3Ztc2cgcmV0dXJucyBhbiBlcnJvciBhZnRlciB3ZQorCQkJICogcmVjZWl2ZWQgc29tZSBkYXRhZ3JhbXMsIHdoZXJlIHdlIHJlY29yZCB0aGUKKwkJCSAqIGVycm9yIHRvIHJldHVybiBvbiB0aGUgbmV4dCBjYWxsIG9yIGlmIHRoZQorCQkJICogYXBwIGFza3MgYWJvdXQgaXQgdXNpbmcgZ2V0c29ja29wdChTT19FUlJPUikuCisJCQkgKi8KKwkJCXNvY2stPnNrLT5za19lcnIgPSAtZXJyOworCQl9CisKKwkJcmV0dXJuIGRhdGFncmFtczsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitTWVNDQUxMX0RFRklORTUocmVjdm1tc2csIGludCwgZmQsIHN0cnVjdCBtbXNnaGRyIF9fdXNlciAqLCBtbXNnLAorCQl1bnNpZ25lZCBpbnQsIHZsZW4sIHVuc2lnbmVkIGludCwgZmxhZ3MsCisJCXN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKiwgdGltZW91dCkKK3sKKwlpbnQgZGF0YWdyYW1zOworCXN0cnVjdCB0aW1lc3BlYyB0aW1lb3V0X3N5czsKKworCWlmIChmbGFncyAmIE1TR19DTVNHX0NPTVBBVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXRpbWVvdXQpCisJCXJldHVybiBfX3N5c19yZWN2bW1zZyhmZCwgbW1zZywgdmxlbiwgZmxhZ3MsIE5VTEwpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0aW1lb3V0X3N5cywgdGltZW91dCwgc2l6ZW9mKHRpbWVvdXRfc3lzKSkpCisJCXJldHVybiAtRUZBVUxUOworCWRhdGFncmFtcyA9IF9fc3lzX3JlY3ZtbXNnKGZkLCBtbXNnLCB2bGVuLCBmbGFncywgJnRpbWVvdXRfc3lzKTsKKworCWlmIChkYXRhZ3JhbXMgPiAwICYmCisJICAgIGNvcHlfdG9fdXNlcih0aW1lb3V0LCAmdGltZW91dF9zeXMsIHNpemVvZih0aW1lb3V0X3N5cykpKQorCQlkYXRhZ3JhbXMgPSAtRUZBVUxUOworCisJcmV0dXJuIGRhdGFncmFtczsKK30KKworI2lmZGVmIF9fQVJDSF9XQU5UX1NZU19TT0NLRVRDQUxMCisvKiBBcmd1bWVudCBsaXN0IHNpemVzIGZvciBzeXNfc29ja2V0Y2FsbCAqLworI2RlZmluZSBBTCh4KSAoKHgpICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbmFyZ3NbMjFdID0geworCUFMKDApLCBBTCgzKSwgQUwoMyksIEFMKDMpLCBBTCgyKSwgQUwoMyksCisJQUwoMyksIEFMKDMpLCBBTCg0KSwgQUwoNCksIEFMKDQpLCBBTCg2KSwKKwlBTCg2KSwgQUwoMiksIEFMKDUpLCBBTCg1KSwgQUwoMyksIEFMKDMpLAorCUFMKDQpLCBBTCg1KSwgQUwoNCkKK307CisKKyN1bmRlZiBBTAorCisvKgorICoJU3lzdGVtIGNhbGwgdmVjdG9ycy4KKyAqCisgKglBcmd1bWVudCBjaGVja2luZyBjbGVhbmVkIHVwLiBTYXZlZCAyMCUgaW4gc2l6ZS4KKyAqICBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgbmVlZCB0byBzZXQgdGhlIGtlcm5lbCBsb2NrIGJlY2F1c2UKKyAqICBpdCBpcyBzZXQgYnkgdGhlIGNhbGxlZXMuCisgKi8KKworU1lTQ0FMTF9ERUZJTkUyKHNvY2tldGNhbGwsIGludCwgY2FsbCwgdW5zaWduZWQgbG9uZyBfX3VzZXIgKiwgYXJncykKK3sKKwl1bnNpZ25lZCBsb25nIGFbNl07CisJdW5zaWduZWQgbG9uZyBhMCwgYTE7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJaWYgKGNhbGwgPCAxIHx8IGNhbGwgPiBTWVNfU0VORE1NU0cpCisJCXJldHVybiAtRUlOVkFMOworCisJbGVuID0gbmFyZ3NbY2FsbF07CisJaWYgKGxlbiA+IHNpemVvZihhKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBjb3B5X2Zyb21fdXNlciBzaG91bGQgYmUgU01QIHNhZmUuICovCisJaWYgKGNvcHlfZnJvbV91c2VyKGEsIGFyZ3MsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCWF1ZGl0X3NvY2tldGNhbGwobmFyZ3NbY2FsbF0gLyBzaXplb2YodW5zaWduZWQgbG9uZyksIGEpOworCisJYTAgPSBhWzBdOworCWExID0gYVsxXTsKKworCXN3aXRjaCAoY2FsbCkgeworCWNhc2UgU1lTX1NPQ0tFVDoKKwkJZXJyID0gc3lzX3NvY2tldChhMCwgYTEsIGFbMl0pOworCQlicmVhazsKKwljYXNlIFNZU19CSU5EOgorCQllcnIgPSBzeXNfYmluZChhMCwgKHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKilhMSwgYVsyXSk7CisJCWJyZWFrOworCWNhc2UgU1lTX0NPTk5FQ1Q6CisJCWVyciA9IHN5c19jb25uZWN0KGEwLCAoc3RydWN0IHNvY2thZGRyIF9fdXNlciAqKWExLCBhWzJdKTsKKwkJYnJlYWs7CisJY2FzZSBTWVNfTElTVEVOOgorCQllcnIgPSBzeXNfbGlzdGVuKGEwLCBhMSk7CisJCWJyZWFrOworCWNhc2UgU1lTX0FDQ0VQVDoKKwkJZXJyID0gc3lzX2FjY2VwdDQoYTAsIChzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICopYTEsCisJCQkJICAoaW50IF9fdXNlciAqKWFbMl0sIDApOworCQlicmVhazsKKwljYXNlIFNZU19HRVRTT0NLTkFNRToKKwkJZXJyID0KKwkJICAgIHN5c19nZXRzb2NrbmFtZShhMCwgKHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKilhMSwKKwkJCQkgICAgKGludCBfX3VzZXIgKilhWzJdKTsKKwkJYnJlYWs7CisJY2FzZSBTWVNfR0VUUEVFUk5BTUU6CisJCWVyciA9CisJCSAgICBzeXNfZ2V0cGVlcm5hbWUoYTAsIChzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICopYTEsCisJCQkJICAgIChpbnQgX191c2VyICopYVsyXSk7CisJCWJyZWFrOworCWNhc2UgU1lTX1NPQ0tFVFBBSVI6CisJCWVyciA9IHN5c19zb2NrZXRwYWlyKGEwLCBhMSwgYVsyXSwgKGludCBfX3VzZXIgKilhWzNdKTsKKwkJYnJlYWs7CisJY2FzZSBTWVNfU0VORDoKKwkJZXJyID0gc3lzX3NlbmQoYTAsICh2b2lkIF9fdXNlciAqKWExLCBhWzJdLCBhWzNdKTsKKwkJYnJlYWs7CisJY2FzZSBTWVNfU0VORFRPOgorCQllcnIgPSBzeXNfc2VuZHRvKGEwLCAodm9pZCBfX3VzZXIgKilhMSwgYVsyXSwgYVszXSwKKwkJCQkgKHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKilhWzRdLCBhWzVdKTsKKwkJYnJlYWs7CisJY2FzZSBTWVNfUkVDVjoKKwkJZXJyID0gc3lzX3JlY3YoYTAsICh2b2lkIF9fdXNlciAqKWExLCBhWzJdLCBhWzNdKTsKKwkJYnJlYWs7CisJY2FzZSBTWVNfUkVDVkZST006CisJCWVyciA9IHN5c19yZWN2ZnJvbShhMCwgKHZvaWQgX191c2VyICopYTEsIGFbMl0sIGFbM10sCisJCQkJICAgKHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKilhWzRdLAorCQkJCSAgIChpbnQgX191c2VyICopYVs1XSk7CisJCWJyZWFrOworCWNhc2UgU1lTX1NIVVRET1dOOgorCQllcnIgPSBzeXNfc2h1dGRvd24oYTAsIGExKTsKKwkJYnJlYWs7CisJY2FzZSBTWVNfU0VUU09DS09QVDoKKwkJZXJyID0gc3lzX3NldHNvY2tvcHQoYTAsIGExLCBhWzJdLCAoY2hhciBfX3VzZXIgKilhWzNdLCBhWzRdKTsKKwkJYnJlYWs7CisJY2FzZSBTWVNfR0VUU09DS09QVDoKKwkJZXJyID0KKwkJICAgIHN5c19nZXRzb2Nrb3B0KGEwLCBhMSwgYVsyXSwgKGNoYXIgX191c2VyICopYVszXSwKKwkJCQkgICAoaW50IF9fdXNlciAqKWFbNF0pOworCQlicmVhazsKKwljYXNlIFNZU19TRU5ETVNHOgorCQllcnIgPSBzeXNfc2VuZG1zZyhhMCwgKHN0cnVjdCBtc2doZHIgX191c2VyICopYTEsIGFbMl0pOworCQlicmVhazsKKwljYXNlIFNZU19TRU5ETU1TRzoKKwkJZXJyID0gc3lzX3NlbmRtbXNnKGEwLCAoc3RydWN0IG1tc2doZHIgX191c2VyICopYTEsIGFbMl0sIGFbM10pOworCQlicmVhazsKKwljYXNlIFNZU19SRUNWTVNHOgorCQllcnIgPSBzeXNfcmVjdm1zZyhhMCwgKHN0cnVjdCBtc2doZHIgX191c2VyICopYTEsIGFbMl0pOworCQlicmVhazsKKwljYXNlIFNZU19SRUNWTU1TRzoKKwkJZXJyID0gc3lzX3JlY3ZtbXNnKGEwLCAoc3RydWN0IG1tc2doZHIgX191c2VyICopYTEsIGFbMl0sIGFbM10sCisJCQkJICAgKHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKilhWzRdKTsKKwkJYnJlYWs7CisJY2FzZSBTWVNfQUNDRVBUNDoKKwkJZXJyID0gc3lzX2FjY2VwdDQoYTAsIChzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICopYTEsCisJCQkJICAoaW50IF9fdXNlciAqKWFbMl0sIGFbM10pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIGVycjsKK30KKworI2VuZGlmCQkJCS8qIF9fQVJDSF9XQU5UX1NZU19TT0NLRVRDQUxMICovCisKKy8qKgorICoJc29ja19yZWdpc3RlciAtIGFkZCBhIHNvY2tldCBwcm90b2NvbCBoYW5kbGVyCisgKglAb3BzOiBkZXNjcmlwdGlvbiBvZiBwcm90b2NvbAorICoKKyAqCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGEgcHJvdG9jb2wgaGFuZGxlciB0aGF0IHdhbnRzIHRvCisgKglhZHZlcnRpc2UgaXRzIGFkZHJlc3MgZmFtaWx5LCBhbmQgaGF2ZSBpdCBsaW5rZWQgaW50byB0aGUKKyAqCXNvY2tldCBpbnRlcmZhY2UuIFRoZSB2YWx1ZSBvcHMtPmZhbWlseSBjb3Jlc3BvbmRzIHRvIHRoZQorICoJc29ja2V0IHN5c3RlbSBjYWxsIHByb3RvY29sIGZhbWlseS4KKyAqLworaW50IHNvY2tfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IG5ldF9wcm90b19mYW1pbHkgKm9wcykKK3sKKwlpbnQgZXJyOworCisJaWYgKG9wcy0+ZmFtaWx5ID49IE5QUk9UTykgeworCQlwcmludF9zdW4oU1VOX0VSUiwicHJvdG9jb2wgJWQgPj0gTlBST1RPKCVkKVxuIiwgb3BzLT5mYW1pbHksCisJCSAgICAgICBOUFJPVE8pOworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQorCisJc3Bpbl9sb2NrKCZuZXRfZmFtaWx5X2xvY2spOworCWlmIChyY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKG5ldF9mYW1pbGllc1tvcHMtPmZhbWlseV0sCisJCQkJICAgICAgbG9ja2RlcF9pc19oZWxkKCZuZXRfZmFtaWx5X2xvY2spKSkKKwkJZXJyID0gLUVFWElTVDsKKwllbHNlIHsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKG5ldF9mYW1pbGllc1tvcHMtPmZhbWlseV0sIG9wcyk7CisJCWVyciA9IDA7CisJfQorCXNwaW5fdW5sb2NrKCZuZXRfZmFtaWx5X2xvY2spOworCisJcHJpbnRfc3VuKFNVTl9EQkcsIk5FVDogUmVnaXN0ZXJlZCBwcm90b2NvbCBmYW1pbHkgJWRcbiIsIG9wcy0+ZmFtaWx5KTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChzb2NrX3JlZ2lzdGVyKTsKKworLyoqCisgKglzb2NrX3VucmVnaXN0ZXIgLSByZW1vdmUgYSBwcm90b2NvbCBoYW5kbGVyCisgKglAZmFtaWx5OiBwcm90b2NvbCBmYW1pbHkgdG8gcmVtb3ZlCisgKgorICoJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYSBwcm90b2NvbCBoYW5kbGVyIHRoYXQgd2FudHMgdG8KKyAqCXJlbW92ZSBpdHMgYWRkcmVzcyBmYW1pbHksIGFuZCBoYXZlIGl0IHVubGlua2VkIGZyb20gdGhlCisgKgluZXcgc29ja2V0IGNyZWF0aW9uLgorICoKKyAqCUlmIHByb3RvY29sIGhhbmRsZXIgaXMgYSBtb2R1bGUsIHRoZW4gaXQgY2FuIHVzZSBtb2R1bGUgcmVmZXJlbmNlCisgKgljb3VudHMgdG8gcHJvdGVjdCBhZ2FpbnN0IG5ldyByZWZlcmVuY2VzLiBJZiBwcm90b2NvbCBoYW5kbGVyIGlzIG5vdAorICoJYSBtb2R1bGUgdGhlbiBpdCBuZWVkcyB0byBwcm92aWRlIGl0cyBvd24gcHJvdGVjdGlvbiBpbgorICoJdGhlIG9wcy0+Y3JlYXRlIHJvdXRpbmUuCisgKi8KK3ZvaWQgc29ja191bnJlZ2lzdGVyKGludCBmYW1pbHkpCit7CisJQlVHX09OKGZhbWlseSA8IDAgfHwgZmFtaWx5ID49IE5QUk9UTyk7CisKKwlzcGluX2xvY2soJm5ldF9mYW1pbHlfbG9jayk7CisJUkNVX0lOSVRfUE9JTlRFUihuZXRfZmFtaWxpZXNbZmFtaWx5XSwgTlVMTCk7CisJc3Bpbl91bmxvY2soJm5ldF9mYW1pbHlfbG9jayk7CisKKwlzeW5jaHJvbml6ZV9yY3UoKTsKKworCXByaW50X3N1bihTVU5fREJHLCJORVQ6IFVucmVnaXN0ZXJlZCBwcm90b2NvbCBmYW1pbHkgJWRcbiIsIGZhbWlseSk7Cit9CitFWFBPUlRfU1lNQk9MKHNvY2tfdW5yZWdpc3Rlcik7CisKK3N0YXRpYyBpbnQgX19pbml0IHNvY2tfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwkvKgorCSAqICAgICAgSW5pdGlhbGl6ZSBzb2NrIFNMQUIgY2FjaGUuCisJICovCisKKwlza19pbml0KCk7CisKKwkvKgorCSAqICAgICAgSW5pdGlhbGl6ZSBza2J1ZmYgU0xBQiBjYWNoZQorCSAqLworCXNrYl9pbml0KCk7CisKKwkvKgorCSAqICAgICAgSW5pdGlhbGl6ZSB0aGUgcHJvdG9jb2xzIG1vZHVsZS4KKwkgKi8KKworCWluaXRfaW5vZGVjYWNoZSgpOworCisJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmc29ja19mc190eXBlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mczsKKwlzb2NrX21udCA9IGtlcm5fbW91bnQoJnNvY2tfZnNfdHlwZSk7CisJaWYgKElTX0VSUihzb2NrX21udCkpIHsKKwkJZXJyID0gUFRSX0VSUihzb2NrX21udCk7CisJCWdvdG8gb3V0X21vdW50OworCX0KKworCS8qIFRoZSByZWFsIHByb3RvY29sIGluaXRpYWxpemF0aW9uIGlzIHBlcmZvcm1lZCBpbiBsYXRlciBpbml0Y2FsbHMuCisJICovCisKKyNpZmRlZiBDT05GSUdfTkVURklMVEVSCisJbmV0ZmlsdGVyX2luaXQoKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX05FVFdPUktfUEhZX1RJTUVTVEFNUElORworCXNrYl90aW1lc3RhbXBpbmdfaW5pdCgpOworI2VuZGlmCisKK291dDoKKwlyZXR1cm4gZXJyOworCitvdXRfbW91bnQ6CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZzb2NrX2ZzX3R5cGUpOworb3V0X2ZzOgorCWdvdG8gb3V0OworfQorCitjb3JlX2luaXRjYWxsKHNvY2tfaW5pdCk7CS8qIGVhcmx5IGluaXRjYWxsICovCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwordm9pZCBzb2NrZXRfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJaW50IGNwdTsKKwlpbnQgY291bnRlciA9IDA7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KQorCSAgICBjb3VudGVyICs9IHBlcl9jcHUoc29ja2V0c19pbl91c2UsIGNwdSk7CisKKwkvKiBJdCBjYW4gYmUgbmVnYXRpdmUsIGJ5IHRoZSB3YXkuIDgpICovCisJaWYgKGNvdW50ZXIgPCAwKQorCQljb3VudGVyID0gMDsKKworCXNlcV9wcmludGYoc2VxLCAic29ja2V0czogdXNlZCAlZFxuIiwgY291bnRlcik7Cit9CisjZW5kaWYJCQkJLyogQ09ORklHX1BST0NfRlMgKi8KKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBpbnQgZG9fc2lvY2dzdGFtcChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKnVwKQoreworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKwlzdHJ1Y3QgdGltZXZhbCBrdHY7CisJaW50IGVycjsKKworCXNldF9mcyhLRVJORUxfRFMpOworCWVyciA9IHNvY2tfZG9faW9jdGwobmV0LCBzb2NrLCBjbWQsICh1bnNpZ25lZCBsb25nKSZrdHYpOworCXNldF9mcyhvbGRfZnMpOworCWlmICghZXJyKQorCQllcnIgPSBjb21wYXRfcHV0X3RpbWV2YWwoJmt0diwgdXApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkb19zaW9jZ3N0YW1wbnMoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKnVwKQoreworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKwlzdHJ1Y3QgdGltZXNwZWMga3RzOworCWludCBlcnI7CisKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwllcnIgPSBzb2NrX2RvX2lvY3RsKG5ldCwgc29jaywgY21kLCAodW5zaWduZWQgbG9uZykma3RzKTsKKwlzZXRfZnMob2xkX2ZzKTsKKwlpZiAoIWVycikKKwkJZXJyID0gY29tcGF0X3B1dF90aW1lc3BlYygma3RzLCB1cCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRldl9pZm5hbWUzMihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBjb21wYXRfaWZyZXEgX191c2VyICp1aWZyMzIpCit7CisJc3RydWN0IGlmcmVxIF9fdXNlciAqdWlmcjsKKwlpbnQgZXJyOworCisJdWlmciA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZihzdHJ1Y3QgaWZyZXEpKTsKKwlpZiAoY29weV9pbl91c2VyKHVpZnIsIHVpZnIzMiwgc2l6ZW9mKHN0cnVjdCBjb21wYXRfaWZyZXEpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBkZXZfaW9jdGwobmV0LCBTSU9DR0lGTkFNRSwgdWlmcik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChjb3B5X2luX3VzZXIodWlmcjMyLCB1aWZyLCBzaXplb2Yoc3RydWN0IGNvbXBhdF9pZnJlcSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRldl9pZmNvbmYoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgY29tcGF0X2lmY29uZiBfX3VzZXIgKnVpZmMzMikKK3sKKwlzdHJ1Y3QgY29tcGF0X2lmY29uZiBpZmMzMjsKKwlzdHJ1Y3QgaWZjb25mIGlmYzsKKwlzdHJ1Y3QgaWZjb25mIF9fdXNlciAqdWlmYzsKKwlzdHJ1Y3QgY29tcGF0X2lmcmVxIF9fdXNlciAqaWZyMzI7CisJc3RydWN0IGlmcmVxIF9fdXNlciAqaWZyOworCXVuc2lnbmVkIGludCBpLCBqOworCWludCBlcnI7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmlmYzMyLCB1aWZjMzIsIHNpemVvZihzdHJ1Y3QgY29tcGF0X2lmY29uZikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW1lbXNldCgmaWZjLCAwLCBzaXplb2YoaWZjKSk7CisJaWYgKGlmYzMyLmlmY2J1ZiA9PSAwKSB7CisJCWlmYzMyLmlmY19sZW4gPSAwOworCQlpZmMuaWZjX2xlbiA9IDA7CisJCWlmYy5pZmNfcmVxID0gTlVMTDsKKwkJdWlmYyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZihzdHJ1Y3QgaWZjb25mKSk7CisJfSBlbHNlIHsKKwkJc2l6ZV90IGxlbiA9ICgoaWZjMzIuaWZjX2xlbiAvIHNpemVvZihzdHJ1Y3QgY29tcGF0X2lmcmVxKSkgKyAxKSAqCisJCQlzaXplb2Yoc3RydWN0IGlmcmVxKTsKKwkJdWlmYyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZihzdHJ1Y3QgaWZjb25mKSArIGxlbik7CisJCWlmYy5pZmNfbGVuID0gbGVuOworCQlpZnIgPSBpZmMuaWZjX3JlcSA9ICh2b2lkIF9fdXNlciAqKSh1aWZjICsgMSk7CisJCWlmcjMyID0gY29tcGF0X3B0cihpZmMzMi5pZmNidWYpOworCQlmb3IgKGkgPSAwOyBpIDwgaWZjMzIuaWZjX2xlbjsgaSArPSBzaXplb2Yoc3RydWN0IGNvbXBhdF9pZnJlcSkpIHsKKwkJCWlmIChjb3B5X2luX3VzZXIoaWZyLCBpZnIzMiwgc2l6ZW9mKHN0cnVjdCBjb21wYXRfaWZyZXEpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmcisrOworCQkJaWZyMzIrKzsKKwkJfQorCX0KKwlpZiAoY29weV90b191c2VyKHVpZmMsICZpZmMsIHNpemVvZihzdHJ1Y3QgaWZjb25mKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyID0gZGV2X2lvY3RsKG5ldCwgU0lPQ0dJRkNPTkYsIHVpZmMpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmlmYywgdWlmYywgc2l6ZW9mKHN0cnVjdCBpZmNvbmYpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZnIgPSBpZmMuaWZjX3JlcTsKKwlpZnIzMiA9IGNvbXBhdF9wdHIoaWZjMzIuaWZjYnVmKTsKKwlmb3IgKGkgPSAwLCBqID0gMDsKKwkgICAgIGkgKyBzaXplb2Yoc3RydWN0IGNvbXBhdF9pZnJlcSkgPD0gaWZjMzIuaWZjX2xlbiAmJiBqIDwgaWZjLmlmY19sZW47CisJICAgICBpICs9IHNpemVvZihzdHJ1Y3QgY29tcGF0X2lmcmVxKSwgaiArPSBzaXplb2Yoc3RydWN0IGlmcmVxKSkgeworCQlpZiAoY29weV9pbl91c2VyKGlmcjMyLCBpZnIsIHNpemVvZihzdHJ1Y3QgY29tcGF0X2lmcmVxKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWZyMzIrKzsKKwkJaWZyKys7CisJfQorCisJaWYgKGlmYzMyLmlmY2J1ZiA9PSAwKSB7CisJCS8qIFRyYW5zbGF0ZSBmcm9tIDY0LWJpdCBzdHJ1Y3R1cmUgbXVsdGlwbGUgdG8KKwkJICogYSAzMi1iaXQgb25lLgorCQkgKi8KKwkJaSA9IGlmYy5pZmNfbGVuOworCQlpID0gKChpIC8gc2l6ZW9mKHN0cnVjdCBpZnJlcSkpICogc2l6ZW9mKHN0cnVjdCBjb21wYXRfaWZyZXEpKTsKKwkJaWZjMzIuaWZjX2xlbiA9IGk7CisJfSBlbHNlIHsKKwkJaWZjMzIuaWZjX2xlbiA9IGk7CisJfQorCWlmIChjb3B5X3RvX3VzZXIodWlmYzMyLCAmaWZjMzIsIHNpemVvZihzdHJ1Y3QgY29tcGF0X2lmY29uZikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV0aHRvb2xfaW9jdGwoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgY29tcGF0X2lmcmVxIF9fdXNlciAqaWZyMzIpCit7CisJc3RydWN0IGNvbXBhdF9ldGh0b29sX3J4bmZjIF9fdXNlciAqY29tcGF0X3J4bmZjOworCWJvb2wgY29udmVydF9pbiA9IGZhbHNlLCBjb252ZXJ0X291dCA9IGZhbHNlOworCXNpemVfdCBidWZfc2l6ZSA9IEFMSUdOKHNpemVvZihzdHJ1Y3QgaWZyZXEpLCA4KTsKKwlzdHJ1Y3QgZXRodG9vbF9yeG5mYyBfX3VzZXIgKnJ4bmZjOworCXN0cnVjdCBpZnJlcSBfX3VzZXIgKmlmcjsKKwl1MzIgcnVsZV9jbnQgPSAwLCBhY3R1YWxfcnVsZV9jbnQ7CisJdTMyIGV0aGNtZDsKKwl1MzIgZGF0YTsKKwlpbnQgcmV0OworCisJaWYgKGdldF91c2VyKGRhdGEsICZpZnIzMi0+aWZyX2lmcnUuaWZydV9kYXRhKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljb21wYXRfcnhuZmMgPSBjb21wYXRfcHRyKGRhdGEpOworCisJaWYgKGdldF91c2VyKGV0aGNtZCwgJmNvbXBhdF9yeG5mYy0+Y21kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBNb3N0IGV0aHRvb2wgc3RydWN0dXJlcyBhcmUgZGVmaW5lZCB3aXRob3V0IHBhZGRpbmcuCisJICogVW5mb3J0dW5hdGVseSBzdHJ1Y3QgZXRodG9vbF9yeG5mYyBpcyBhbiBleGNlcHRpb24uCisJICovCisJc3dpdGNoIChldGhjbWQpIHsKKwlkZWZhdWx0OgorCQlicmVhazsKKwljYXNlIEVUSFRPT0xfR1JYQ0xTUkxBTEw6CisJCS8qIEJ1ZmZlciBzaXplIGlzIHZhcmlhYmxlICovCisJCWlmIChnZXRfdXNlcihydWxlX2NudCwgJmNvbXBhdF9yeG5mYy0+cnVsZV9jbnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChydWxlX2NudCA+IEtNQUxMT0NfTUFYX1NJWkUgLyBzaXplb2YodTMyKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlidWZfc2l6ZSArPSBydWxlX2NudCAqIHNpemVvZih1MzIpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIEVUSFRPT0xfR1JYUklOR1M6CisJY2FzZSBFVEhUT09MX0dSWENMU1JMQ05UOgorCWNhc2UgRVRIVE9PTF9HUlhDTFNSVUxFOgorCWNhc2UgRVRIVE9PTF9TUlhDTFNSTElOUzoKKwkJY29udmVydF9vdXQgPSB0cnVlOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIEVUSFRPT0xfU1JYQ0xTUkxERUw6CisJCWJ1Zl9zaXplICs9IHNpemVvZihzdHJ1Y3QgZXRodG9vbF9yeG5mYyk7CisJCWNvbnZlcnRfaW4gPSB0cnVlOworCQlicmVhazsKKwl9CisKKwlpZnIgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShidWZfc2l6ZSk7CisJcnhuZmMgPSAodm9pZCAqKWlmciArIEFMSUdOKHNpemVvZihzdHJ1Y3QgaWZyZXEpLCA4KTsKKworCWlmIChjb3B5X2luX3VzZXIoJmlmci0+aWZyX25hbWUsICZpZnIzMi0+aWZyX25hbWUsIElGTkFNU0laKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAocHV0X3VzZXIoY29udmVydF9pbiA/IHJ4bmZjIDogY29tcGF0X3B0cihkYXRhKSwKKwkJICAgICAmaWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb252ZXJ0X2luKSB7CisJCS8qIFdlIGV4cGVjdCB0aGVyZSB0byBiZSBob2xlcyBiZXR3ZWVuIGZzLm1fZXh0IGFuZAorCQkgKiBmcy5yaW5nX2Nvb2tpZSBhbmQgYXQgdGhlIGVuZCBvZiBmcywgYnV0IG5vd2hlcmUgZWxzZS4KKwkJICovCisJCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgY29tcGF0X2V0aHRvb2xfcnhuZmMsIGZzLm1fZXh0KSArCisJCQkgICAgIHNpemVvZihjb21wYXRfcnhuZmMtPmZzLm1fZXh0KSAhPQorCQkJICAgICBvZmZzZXRvZihzdHJ1Y3QgZXRodG9vbF9yeG5mYywgZnMubV9leHQpICsKKwkJCSAgICAgc2l6ZW9mKHJ4bmZjLT5mcy5tX2V4dCkpOworCQlCVUlMRF9CVUdfT04oCisJCQlvZmZzZXRvZihzdHJ1Y3QgY29tcGF0X2V0aHRvb2xfcnhuZmMsIGZzLmxvY2F0aW9uKSAtCisJCQlvZmZzZXRvZihzdHJ1Y3QgY29tcGF0X2V0aHRvb2xfcnhuZmMsIGZzLnJpbmdfY29va2llKSAhPQorCQkJb2Zmc2V0b2Yoc3RydWN0IGV0aHRvb2xfcnhuZmMsIGZzLmxvY2F0aW9uKSAtCisJCQlvZmZzZXRvZihzdHJ1Y3QgZXRodG9vbF9yeG5mYywgZnMucmluZ19jb29raWUpKTsKKworCQlpZiAoY29weV9pbl91c2VyKHJ4bmZjLCBjb21wYXRfcnhuZmMsCisJCQkJICh2b2lkICopKCZyeG5mYy0+ZnMubV9leHQgKyAxKSAtCisJCQkJICh2b2lkICopcnhuZmMpIHx8CisJCSAgICBjb3B5X2luX3VzZXIoJnJ4bmZjLT5mcy5yaW5nX2Nvb2tpZSwKKwkJCQkgJmNvbXBhdF9yeG5mYy0+ZnMucmluZ19jb29raWUsCisJCQkJICh2b2lkICopKCZyeG5mYy0+ZnMubG9jYXRpb24gKyAxKSAtCisJCQkJICh2b2lkICopJnJ4bmZjLT5mcy5yaW5nX2Nvb2tpZSkgfHwKKwkJICAgIGNvcHlfaW5fdXNlcigmcnhuZmMtPnJ1bGVfY250LCAmY29tcGF0X3J4bmZjLT5ydWxlX2NudCwKKwkJCQkgc2l6ZW9mKHJ4bmZjLT5ydWxlX2NudCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0ID0gZGV2X2lvY3RsKG5ldCwgU0lPQ0VUSFRPT0wsIGlmcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChjb252ZXJ0X291dCkgeworCQlpZiAoY29weV9pbl91c2VyKGNvbXBhdF9yeG5mYywgcnhuZmMsCisJCQkJIChjb25zdCB2b2lkICopKCZyeG5mYy0+ZnMubV9leHQgKyAxKSAtCisJCQkJIChjb25zdCB2b2lkICopcnhuZmMpIHx8CisJCSAgICBjb3B5X2luX3VzZXIoJmNvbXBhdF9yeG5mYy0+ZnMucmluZ19jb29raWUsCisJCQkJICZyeG5mYy0+ZnMucmluZ19jb29raWUsCisJCQkJIChjb25zdCB2b2lkICopKCZyeG5mYy0+ZnMubG9jYXRpb24gKyAxKSAtCisJCQkJIChjb25zdCB2b2lkICopJnJ4bmZjLT5mcy5yaW5nX2Nvb2tpZSkgfHwKKwkJICAgIGNvcHlfaW5fdXNlcigmY29tcGF0X3J4bmZjLT5ydWxlX2NudCwgJnJ4bmZjLT5ydWxlX2NudCwKKwkJCQkgc2l6ZW9mKHJ4bmZjLT5ydWxlX2NudCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGV0aGNtZCA9PSBFVEhUT09MX0dSWENMU1JMQUxMKSB7CisJCQkvKiBBcyBhbiBvcHRpbWlzYXRpb24sIHdlIG9ubHkgY29weSB0aGUgYWN0dWFsCisJCQkgKiBudW1iZXIgb2YgcnVsZXMgdGhhdCB0aGUgdW5kZXJseWluZworCQkJICogZnVuY3Rpb24gcmV0dXJuZWQuICBTaW5jZSBNYWxsb3J5IG1pZ2h0CisJCQkgKiBjaGFuZ2UgdGhlIHJ1bGUgY291bnQgaW4gdXNlciBtZW1vcnksIHdlCisJCQkgKiBjaGVjayB0aGF0IGl0IGlzIGxlc3MgdGhhbiB0aGUgcnVsZSBjb3VudAorCQkJICogb3JpZ2luYWxseSBnaXZlbiAoYXMgdGhlIHVzZXIgYnVmZmVyIHNpemUpLAorCQkJICogd2hpY2ggaGFzIGJlZW4gcmFuZ2UtY2hlY2tlZC4KKwkJCSAqLworCQkJaWYgKGdldF91c2VyKGFjdHVhbF9ydWxlX2NudCwgJnJ4bmZjLT5ydWxlX2NudCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoYWN0dWFsX3J1bGVfY250IDwgcnVsZV9jbnQpCisJCQkJcnVsZV9jbnQgPSBhY3R1YWxfcnVsZV9jbnQ7CisJCQlpZiAoY29weV9pbl91c2VyKCZjb21wYXRfcnhuZmMtPnJ1bGVfbG9jc1swXSwKKwkJCQkJICZyeG5mYy0+cnVsZV9sb2NzWzBdLAorCQkJCQkgcnVsZV9jbnQgKiBzaXplb2YodTMyKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21wYXRfc2lvY3dhbmRldihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBjb21wYXRfaWZyZXEgX191c2VyICp1aWZyMzIpCit7CisJdm9pZCBfX3VzZXIgKnVwdHI7CisJY29tcGF0X3VwdHJfdCB1cHRyMzI7CisJc3RydWN0IGlmcmVxIF9fdXNlciAqdWlmcjsKKworCXVpZnIgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnVpZnIpKTsKKwlpZiAoY29weV9pbl91c2VyKHVpZnIsIHVpZnIzMiwgc2l6ZW9mKHN0cnVjdCBjb21wYXRfaWZyZXEpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZ2V0X3VzZXIodXB0cjMyLCAmdWlmcjMyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3UpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXVwdHIgPSBjb21wYXRfcHRyKHVwdHIzMik7CisKKwlpZiAocHV0X3VzZXIodXB0ciwgJnVpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5yYXdfaGRsYykpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRldl9pb2N0bChuZXQsIFNJT0NXQU5ERVYsIHVpZnIpOworfQorCitzdGF0aWMgaW50IGJvbmRfaW9jdGwoc3RydWN0IG5ldCAqbmV0LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJIHN0cnVjdCBjb21wYXRfaWZyZXEgX191c2VyICppZnIzMikKK3sKKwlzdHJ1Y3QgaWZyZXEga2lmcjsKKwlzdHJ1Y3QgaWZyZXEgX191c2VyICp1aWZyOworCW1tX3NlZ21lbnRfdCBvbGRfZnM7CisJaW50IGVycjsKKwl1MzIgZGF0YTsKKwl2b2lkIF9fdXNlciAqZGF0YXA7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0JPTkRFTlNMQVZFOgorCWNhc2UgU0lPQ0JPTkRSRUxFQVNFOgorCWNhc2UgU0lPQ0JPTkRTRVRIV0FERFI6CisJY2FzZSBTSU9DQk9ORENIQU5HRUFDVElWRToKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZraWZyLCBpZnIzMiwgc2l6ZW9mKHN0cnVjdCBjb21wYXRfaWZyZXEpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCW9sZF9mcyA9IGdldF9mcygpOworCQlzZXRfZnMoS0VSTkVMX0RTKTsKKwkJZXJyID0gZGV2X2lvY3RsKG5ldCwgY21kLAorCQkJCShzdHJ1Y3QgaWZyZXEgX191c2VyIF9fZm9yY2UgKikgJmtpZnIpOworCQlzZXRfZnMob2xkX2ZzKTsKKworCQlyZXR1cm4gZXJyOworCWNhc2UgU0lPQ0JPTkRTTEFWRUlORk9RVUVSWToKKwljYXNlIFNJT0NCT05ESU5GT1FVRVJZOgorCQl1aWZyID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCp1aWZyKSk7CisJCWlmIChjb3B5X2luX3VzZXIoJnVpZnItPmlmcl9uYW1lLCAmaWZyMzItPmlmcl9uYW1lLCBJRk5BTVNJWikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoZ2V0X3VzZXIoZGF0YSwgJmlmcjMyLT5pZnJfaWZydS5pZnJ1X2RhdGEpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJZGF0YXAgPSBjb21wYXRfcHRyKGRhdGEpOworCQlpZiAocHV0X3VzZXIoZGF0YXAsICZ1aWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIGRldl9pb2N0bChuZXQsIGNtZCwgdWlmcik7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2lvY2RldnByaXZhdGVfaW9jdGwoc3RydWN0IG5ldCAqbmV0LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSBzdHJ1Y3QgY29tcGF0X2lmcmVxIF9fdXNlciAqdV9pZnJlcTMyKQoreworCXN0cnVjdCBpZnJlcSBfX3VzZXIgKnVfaWZyZXE2NDsKKwljaGFyIHRtcF9idWZbSUZOQU1TSVpdOworCXZvaWQgX191c2VyICpkYXRhNjQ7CisJdTMyIGRhdGEzMjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wX2J1ZlswXSwgJih1X2lmcmVxMzItPmlmcl9pZnJuLmlmcm5fbmFtZVswXSksCisJCQkgICBJRk5BTVNJWikpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChfX2dldF91c2VyKGRhdGEzMiwgJnVfaWZyZXEzMi0+aWZyX2lmcnUuaWZydV9kYXRhKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZGF0YTY0ID0gY29tcGF0X3B0cihkYXRhMzIpOworCisJdV9pZnJlcTY0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCp1X2lmcmVxNjQpKTsKKworCS8qIERvbid0IGNoZWNrIHRoZXNlIHVzZXIgYWNjZXNzZXMsIGp1c3QgbGV0IHRoYXQgZ2V0IHRyYXBwZWQKKwkgKiBpbiB0aGUgaW9jdGwgaGFuZGxlciBpbnN0ZWFkLgorCSAqLworCWlmIChjb3B5X3RvX3VzZXIoJnVfaWZyZXE2NC0+aWZyX2lmcm4uaWZybl9uYW1lWzBdLCAmdG1wX2J1ZlswXSwKKwkJCSBJRk5BTVNJWikpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChfX3B1dF91c2VyKGRhdGE2NCwgJnVfaWZyZXE2NC0+aWZyX2lmcnUuaWZydV9kYXRhKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gZGV2X2lvY3RsKG5ldCwgY21kLCB1X2lmcmVxNjQpOworfQorCitzdGF0aWMgaW50IGRldl9pZnNpb2Moc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBjb21wYXRfaWZyZXEgX191c2VyICp1aWZyMzIpCit7CisJc3RydWN0IGlmcmVxIF9fdXNlciAqdWlmcjsKKwlpbnQgZXJyOworCisJdWlmciA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqdWlmcikpOworCWlmIChjb3B5X2luX3VzZXIodWlmciwgdWlmcjMyLCBzaXplb2YoKnVpZnIzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVyciA9IHNvY2tfZG9faW9jdGwobmV0LCBzb2NrLCBjbWQsICh1bnNpZ25lZCBsb25nKXVpZnIpOworCisJaWYgKCFlcnIpIHsKKwkJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBTSU9DR0lGRkxBR1M6CisJCWNhc2UgU0lPQ0dJRk1FVFJJQzoKKwkJY2FzZSBTSU9DR0lGTVRVOgorCQljYXNlIFNJT0NHSUZNRU06CisJCWNhc2UgU0lPQ0dJRkhXQUREUjoKKwkJY2FzZSBTSU9DR0lGSU5ERVg6CisJCWNhc2UgU0lPQ0dJRkFERFI6CisJCWNhc2UgU0lPQ0dJRkJSREFERFI6CisJCWNhc2UgU0lPQ0dJRkRTVEFERFI6CisJCWNhc2UgU0lPQ0dJRk5FVE1BU0s6CisJCWNhc2UgU0lPQ0dJRlBGTEFHUzoKKwkJY2FzZSBTSU9DR0lGVFhRTEVOOgorCQljYXNlIFNJT0NHTUlJUEhZOgorCQljYXNlIFNJT0NHTUlJUkVHOgorCQkJaWYgKGNvcHlfaW5fdXNlcih1aWZyMzIsIHVpZnIsIHNpemVvZigqdWlmcjMyKSkpCisJCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgY29tcGF0X3Npb2NfaWZtYXAoc3RydWN0IG5ldCAqbmV0LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJc3RydWN0IGNvbXBhdF9pZnJlcSBfX3VzZXIgKnVpZnIzMikKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCXN0cnVjdCBjb21wYXRfaWZtYXAgX191c2VyICp1aWZtYXAzMjsKKwltbV9zZWdtZW50X3Qgb2xkX2ZzOworCWludCBlcnI7CisKKwl1aWZtYXAzMiA9ICZ1aWZyMzItPmlmcl9pZnJ1LmlmcnVfbWFwOworCWVyciA9IGNvcHlfZnJvbV91c2VyKCZpZnIsIHVpZnIzMiwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOworCWVyciB8PSBfX2dldF91c2VyKGlmci5pZnJfbWFwLm1lbV9zdGFydCwgJnVpZm1hcDMyLT5tZW1fc3RhcnQpOworCWVyciB8PSBfX2dldF91c2VyKGlmci5pZnJfbWFwLm1lbV9lbmQsICZ1aWZtYXAzMi0+bWVtX2VuZCk7CisJZXJyIHw9IF9fZ2V0X3VzZXIoaWZyLmlmcl9tYXAuYmFzZV9hZGRyLCAmdWlmbWFwMzItPmJhc2VfYWRkcik7CisJZXJyIHw9IF9fZ2V0X3VzZXIoaWZyLmlmcl9tYXAuaXJxLCAmdWlmbWFwMzItPmlycSk7CisJZXJyIHw9IF9fZ2V0X3VzZXIoaWZyLmlmcl9tYXAuZG1hLCAmdWlmbWFwMzItPmRtYSk7CisJZXJyIHw9IF9fZ2V0X3VzZXIoaWZyLmlmcl9tYXAucG9ydCwgJnVpZm1hcDMyLT5wb3J0KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW9sZF9mcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCWVyciA9IGRldl9pb2N0bChuZXQsIGNtZCwgKHZvaWQgIF9fdXNlciBfX2ZvcmNlICopJmlmcik7CisJc2V0X2ZzKG9sZF9mcyk7CisKKwlpZiAoY21kID09IFNJT0NHSUZNQVAgJiYgIWVycikgeworCQllcnIgPSBjb3B5X3RvX3VzZXIodWlmcjMyLCAmaWZyLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisJCWVyciB8PSBfX3B1dF91c2VyKGlmci5pZnJfbWFwLm1lbV9zdGFydCwgJnVpZm1hcDMyLT5tZW1fc3RhcnQpOworCQllcnIgfD0gX19wdXRfdXNlcihpZnIuaWZyX21hcC5tZW1fZW5kLCAmdWlmbWFwMzItPm1lbV9lbmQpOworCQllcnIgfD0gX19wdXRfdXNlcihpZnIuaWZyX21hcC5iYXNlX2FkZHIsICZ1aWZtYXAzMi0+YmFzZV9hZGRyKTsKKwkJZXJyIHw9IF9fcHV0X3VzZXIoaWZyLmlmcl9tYXAuaXJxLCAmdWlmbWFwMzItPmlycSk7CisJCWVyciB8PSBfX3B1dF91c2VyKGlmci5pZnJfbWFwLmRtYSwgJnVpZm1hcDMyLT5kbWEpOworCQllcnIgfD0gX19wdXRfdXNlcihpZnIuaWZyX21hcC5wb3J0LCAmdWlmbWFwMzItPnBvcnQpOworCQlpZiAoZXJyKQorCQkJZXJyID0gLUVGQVVMVDsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBjb21wYXRfc2lvY3Nod3RzdGFtcChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBjb21wYXRfaWZyZXEgX191c2VyICp1aWZyMzIpCit7CisJdm9pZCBfX3VzZXIgKnVwdHI7CisJY29tcGF0X3VwdHJfdCB1cHRyMzI7CisJc3RydWN0IGlmcmVxIF9fdXNlciAqdWlmcjsKKworCXVpZnIgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnVpZnIpKTsKKwlpZiAoY29weV9pbl91c2VyKHVpZnIsIHVpZnIzMiwgc2l6ZW9mKHN0cnVjdCBjb21wYXRfaWZyZXEpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZ2V0X3VzZXIodXB0cjMyLCAmdWlmcjMyLT5pZnJfZGF0YSkpCisJCXJldHVybiAtRUZBVUxUOworCisJdXB0ciA9IGNvbXBhdF9wdHIodXB0cjMyKTsKKworCWlmIChwdXRfdXNlcih1cHRyLCAmdWlmci0+aWZyX2RhdGEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkZXZfaW9jdGwobmV0LCBTSU9DU0hXVFNUQU1QLCB1aWZyKTsKK30KKworc3RydWN0IHJ0ZW50cnkzMiB7CisJdTMyCQlydF9wYWQxOworCXN0cnVjdCBzb2NrYWRkciBydF9kc3Q7ICAgICAgICAgLyogdGFyZ2V0IGFkZHJlc3MgICAgICAgICAgICAgICAqLworCXN0cnVjdCBzb2NrYWRkciBydF9nYXRld2F5OyAgICAgLyogZ2F0ZXdheSBhZGRyIChSVEZfR0FURVdBWSkgICAqLworCXN0cnVjdCBzb2NrYWRkciBydF9nZW5tYXNrOyAgICAgLyogdGFyZ2V0IG5ldHdvcmsgbWFzayAoSVApICAgICAqLworCXVuc2lnbmVkIHNob3J0CXJ0X2ZsYWdzOworCXNob3J0CQlydF9wYWQyOworCXUzMgkJcnRfcGFkMzsKKwl1bnNpZ25lZCBjaGFyCXJ0X3RvczsKKwl1bnNpZ25lZCBjaGFyCXJ0X2NsYXNzOworCXNob3J0CQlydF9wYWQ0OworCXNob3J0CQlydF9tZXRyaWM7ICAgICAgLyogKzEgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5ISAqLworCS8qIGNoYXIgKiAqLyB1MzIgcnRfZGV2OyAgICAgICAgLyogZm9yY2luZyB0aGUgZGV2aWNlIGF0IGFkZCAgICAqLworCXUzMgkJcnRfbXR1OyAgICAgICAgIC8qIHBlciByb3V0ZSBNVFUvV2luZG93ICAgICAgICAgKi8KKwl1MzIJCXJ0X3dpbmRvdzsgICAgICAvKiBXaW5kb3cgY2xhbXBpbmcgICAgICAgICAgICAgICovCisJdW5zaWduZWQgc2hvcnQgIHJ0X2lydHQ7ICAgICAgICAvKiBJbml0aWFsIFJUVCAgICAgICAgICAgICAgICAgICovCit9OworCitzdHJ1Y3QgaW42X3J0bXNnMzIgeworCXN0cnVjdCBpbjZfYWRkcgkJcnRtc2dfZHN0OworCXN0cnVjdCBpbjZfYWRkcgkJcnRtc2dfc3JjOworCXN0cnVjdCBpbjZfYWRkcgkJcnRtc2dfZ2F0ZXdheTsKKwl1MzIJCQlydG1zZ190eXBlOworCXUxNgkJCXJ0bXNnX2RzdF9sZW47CisJdTE2CQkJcnRtc2dfc3JjX2xlbjsKKwl1MzIJCQlydG1zZ19tZXRyaWM7CisJdTMyCQkJcnRtc2dfaW5mbzsKKwl1MzIJCQlydG1zZ19mbGFnczsKKwlzMzIJCQlydG1zZ19pZmluZGV4OworfTsKKworc3RhdGljIGludCByb3V0aW5nX2lvY3RsKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCSB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJncCkKK3sKKwlpbnQgcmV0OworCXZvaWQgKnIgPSBOVUxMOworCXN0cnVjdCBpbjZfcnRtc2cgcjY7CisJc3RydWN0IHJ0ZW50cnkgcjQ7CisJY2hhciBkZXZuYW1lWzE2XTsKKwl1MzIgcnRkZXY7CisJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOworCisJaWYgKHNvY2sgJiYgc29jay0+c2sgJiYgc29jay0+c2stPnNrX2ZhbWlseSA9PSBBRl9JTkVUNikgeyAvKiBpcHY2ICovCisJCXN0cnVjdCBpbjZfcnRtc2czMiBfX3VzZXIgKnVyNiA9IGFyZ3A7CisJCXJldCA9IGNvcHlfZnJvbV91c2VyKCZyNi5ydG1zZ19kc3QsICYodXI2LT5ydG1zZ19kc3QpLAorCQkJMyAqIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJcmV0IHw9IF9fZ2V0X3VzZXIocjYucnRtc2dfdHlwZSwgJih1cjYtPnJ0bXNnX3R5cGUpKTsKKwkJcmV0IHw9IF9fZ2V0X3VzZXIocjYucnRtc2dfZHN0X2xlbiwgJih1cjYtPnJ0bXNnX2RzdF9sZW4pKTsKKwkJcmV0IHw9IF9fZ2V0X3VzZXIocjYucnRtc2dfc3JjX2xlbiwgJih1cjYtPnJ0bXNnX3NyY19sZW4pKTsKKwkJcmV0IHw9IF9fZ2V0X3VzZXIocjYucnRtc2dfbWV0cmljLCAmKHVyNi0+cnRtc2dfbWV0cmljKSk7CisJCXJldCB8PSBfX2dldF91c2VyKHI2LnJ0bXNnX2luZm8sICYodXI2LT5ydG1zZ19pbmZvKSk7CisJCXJldCB8PSBfX2dldF91c2VyKHI2LnJ0bXNnX2ZsYWdzLCAmKHVyNi0+cnRtc2dfZmxhZ3MpKTsKKwkJcmV0IHw9IF9fZ2V0X3VzZXIocjYucnRtc2dfaWZpbmRleCwgJih1cjYtPnJ0bXNnX2lmaW5kZXgpKTsKKworCQlyID0gKHZvaWQgKikgJnI2OworCX0gZWxzZSB7IC8qIGlwdjQgKi8KKwkJc3RydWN0IHJ0ZW50cnkzMiBfX3VzZXIgKnVyNCA9IGFyZ3A7CisJCXJldCA9IGNvcHlfZnJvbV91c2VyKCZyNC5ydF9kc3QsICYodXI0LT5ydF9kc3QpLAorCQkJCQkzICogc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpOworCQlyZXQgfD0gX19nZXRfdXNlcihyNC5ydF9mbGFncywgJih1cjQtPnJ0X2ZsYWdzKSk7CisJCXJldCB8PSBfX2dldF91c2VyKHI0LnJ0X21ldHJpYywgJih1cjQtPnJ0X21ldHJpYykpOworCQlyZXQgfD0gX19nZXRfdXNlcihyNC5ydF9tdHUsICYodXI0LT5ydF9tdHUpKTsKKwkJcmV0IHw9IF9fZ2V0X3VzZXIocjQucnRfd2luZG93LCAmKHVyNC0+cnRfd2luZG93KSk7CisJCXJldCB8PSBfX2dldF91c2VyKHI0LnJ0X2lydHQsICYodXI0LT5ydF9pcnR0KSk7CisJCXJldCB8PSBfX2dldF91c2VyKHJ0ZGV2LCAmKHVyNC0+cnRfZGV2KSk7CisJCWlmIChydGRldikgeworCQkJcmV0IHw9IGNvcHlfZnJvbV91c2VyKGRldm5hbWUsIGNvbXBhdF9wdHIocnRkZXYpLCAxNSk7CisJCQlyNC5ydF9kZXYgPSAoY2hhciBfX3VzZXIgX19mb3JjZSAqKWRldm5hbWU7CisJCQlkZXZuYW1lWzE1XSA9IDA7CisJCX0gZWxzZQorCQkJcjQucnRfZGV2ID0gTlVMTDsKKworCQlyID0gKHZvaWQgKikgJnI0OworCX0KKworCWlmIChyZXQpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJc2V0X2ZzKEtFUk5FTF9EUyk7CisJcmV0ID0gc29ja19kb19pb2N0bChuZXQsIHNvY2ssIGNtZCwgKHVuc2lnbmVkIGxvbmcpIHIpOworCXNldF9mcyhvbGRfZnMpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogU2luY2Ugb2xkIHN0eWxlIGJyaWRnZSBpb2N0bCdzIGVuZHVwIHVzaW5nIFNJT0NERVZQUklWQVRFCisgKiBmb3Igc29tZSBvcGVyYXRpb25zOyB0aGlzIGZvcmNlcyB1c2Ugb2YgdGhlIG5ld2VyIGJyaWRnZS11dGlscyB0aGF0CisgKiB1c2UgY29tcGF0aWJsZSBpb2N0bHMKKyAqLworc3RhdGljIGludCBvbGRfYnJpZGdlX2lvY3RsKGNvbXBhdF91bG9uZ190IF9fdXNlciAqYXJncCkKK3sKKwljb21wYXRfdWxvbmdfdCB0bXA7CisKKwlpZiAoZ2V0X3VzZXIodG1wLCBhcmdwKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHRtcCA9PSBCUkNUTF9HRVRfVkVSU0lPTikKKwkJcmV0dXJuIEJSQ1RMX1ZFUlNJT04gKyAxOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGNvbXBhdF9zb2NrX2lvY3RsX3RyYW5zKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZvaWQgX191c2VyICphcmdwID0gY29tcGF0X3B0cihhcmcpOworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTsKKworCWlmIChjbWQgPj0gU0lPQ0RFVlBSSVZBVEUgJiYgY21kIDw9IChTSU9DREVWUFJJVkFURSArIDE1KSkKKwkJcmV0dXJuIHNpb2NkZXZwcml2YXRlX2lvY3RsKG5ldCwgY21kLCBhcmdwKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DU0lGQlI6CisJY2FzZSBTSU9DR0lGQlI6CisJCXJldHVybiBvbGRfYnJpZGdlX2lvY3RsKGFyZ3ApOworCWNhc2UgU0lPQ0dJRk5BTUU6CisJCXJldHVybiBkZXZfaWZuYW1lMzIobmV0LCBhcmdwKTsKKwljYXNlIFNJT0NHSUZDT05GOgorCQlyZXR1cm4gZGV2X2lmY29uZihuZXQsIGFyZ3ApOworCWNhc2UgU0lPQ0VUSFRPT0w6CisJCXJldHVybiBldGh0b29sX2lvY3RsKG5ldCwgYXJncCk7CisJY2FzZSBTSU9DV0FOREVWOgorCQlyZXR1cm4gY29tcGF0X3Npb2N3YW5kZXYobmV0LCBhcmdwKTsKKwljYXNlIFNJT0NHSUZNQVA6CisJY2FzZSBTSU9DU0lGTUFQOgorCQlyZXR1cm4gY29tcGF0X3Npb2NfaWZtYXAobmV0LCBjbWQsIGFyZ3ApOworCWNhc2UgU0lPQ0JPTkRFTlNMQVZFOgorCWNhc2UgU0lPQ0JPTkRSRUxFQVNFOgorCWNhc2UgU0lPQ0JPTkRTRVRIV0FERFI6CisJY2FzZSBTSU9DQk9ORFNMQVZFSU5GT1FVRVJZOgorCWNhc2UgU0lPQ0JPTkRJTkZPUVVFUlk6CisJY2FzZSBTSU9DQk9ORENIQU5HRUFDVElWRToKKwkJcmV0dXJuIGJvbmRfaW9jdGwobmV0LCBjbWQsIGFyZ3ApOworCWNhc2UgU0lPQ0FERFJUOgorCWNhc2UgU0lPQ0RFTFJUOgorCQlyZXR1cm4gcm91dGluZ19pb2N0bChuZXQsIHNvY2ssIGNtZCwgYXJncCk7CisJY2FzZSBTSU9DR1NUQU1QOgorCQlyZXR1cm4gZG9fc2lvY2dzdGFtcChuZXQsIHNvY2ssIGNtZCwgYXJncCk7CisJY2FzZSBTSU9DR1NUQU1QTlM6CisJCXJldHVybiBkb19zaW9jZ3N0YW1wbnMobmV0LCBzb2NrLCBjbWQsIGFyZ3ApOworCWNhc2UgU0lPQ1NIV1RTVEFNUDoKKwkJcmV0dXJuIGNvbXBhdF9zaW9jc2h3dHN0YW1wKG5ldCwgYXJncCk7CisKKwljYXNlIEZJT1NFVE9XTjoKKwljYXNlIFNJT0NTUEdSUDoKKwljYXNlIEZJT0dFVE9XTjoKKwljYXNlIFNJT0NHUEdSUDoKKwljYXNlIFNJT0NCUkFEREJSOgorCWNhc2UgU0lPQ0JSREVMQlI6CisJY2FzZSBTSU9DR0lGVkxBTjoKKwljYXNlIFNJT0NTSUZWTEFOOgorCWNhc2UgU0lPQ0FERERMQ0k6CisJY2FzZSBTSU9DREVMRExDSToKKwkJcmV0dXJuIHNvY2tfaW9jdGwoZmlsZSwgY21kLCBhcmcpOworCisJY2FzZSBTSU9DR0lGRkxBR1M6CisJY2FzZSBTSU9DU0lGRkxBR1M6CisJY2FzZSBTSU9DR0lGTUVUUklDOgorCWNhc2UgU0lPQ1NJRk1FVFJJQzoKKwljYXNlIFNJT0NHSUZNVFU6CisJY2FzZSBTSU9DU0lGTVRVOgorCWNhc2UgU0lPQ0dJRk1FTToKKwljYXNlIFNJT0NTSUZNRU06CisJY2FzZSBTSU9DR0lGSFdBRERSOgorCWNhc2UgU0lPQ1NJRkhXQUREUjoKKwljYXNlIFNJT0NBRERNVUxUSToKKwljYXNlIFNJT0NERUxNVUxUSToKKwljYXNlIFNJT0NHSUZJTkRFWDoKKwljYXNlIFNJT0NHSUZBRERSOgorCWNhc2UgU0lPQ1NJRkFERFI6CisJY2FzZSBTSU9DU0lGSFdCUk9BRENBU1Q6CisJY2FzZSBTSU9DRElGQUREUjoKKwljYXNlIFNJT0NHSUZCUkRBRERSOgorCWNhc2UgU0lPQ1NJRkJSREFERFI6CisJY2FzZSBTSU9DR0lGRFNUQUREUjoKKwljYXNlIFNJT0NTSUZEU1RBRERSOgorCWNhc2UgU0lPQ0dJRk5FVE1BU0s6CisJY2FzZSBTSU9DU0lGTkVUTUFTSzoKKwljYXNlIFNJT0NTSUZQRkxBR1M6CisJY2FzZSBTSU9DR0lGUEZMQUdTOgorCWNhc2UgU0lPQ0dJRlRYUUxFTjoKKwljYXNlIFNJT0NTSUZUWFFMRU46CisJY2FzZSBTSU9DQlJBRERJRjoKKwljYXNlIFNJT0NCUkRFTElGOgorCWNhc2UgU0lPQ1NJRk5BTUU6CisJY2FzZSBTSU9DR01JSVBIWToKKwljYXNlIFNJT0NHTUlJUkVHOgorCWNhc2UgU0lPQ1NNSUlSRUc6CisJCXJldHVybiBkZXZfaWZzaW9jKG5ldCwgc29jaywgY21kLCBhcmdwKTsKKworCWNhc2UgU0lPQ1NBUlA6CisJY2FzZSBTSU9DR0FSUDoKKwljYXNlIFNJT0NEQVJQOgorCWNhc2UgU0lPQ0FUTUFSSzoKKwkJcmV0dXJuIHNvY2tfZG9faW9jdGwobmV0LCBzb2NrLCBjbWQsIGFyZyk7CisJfQorCisJcmV0dXJuIC1FTk9JT0NUTENNRDsKK30KKworc3RhdGljIGxvbmcgY29tcGF0X3NvY2tfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGNtZCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldCA9IC1FTk9JT0NUTENNRDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IG5ldCAqbmV0OworCisJc2sgPSBzb2NrLT5zazsKKwluZXQgPSBzb2NrX25ldChzayk7CisKKwlpZiAoc29jay0+b3BzLT5jb21wYXRfaW9jdGwpCisJCXJldCA9IHNvY2stPm9wcy0+Y29tcGF0X2lvY3RsKHNvY2ssIGNtZCwgYXJnKTsKKworCWlmIChyZXQgPT0gLUVOT0lPQ1RMQ01EICYmCisJICAgIChjbWQgPj0gU0lPQ0lXRklSU1QgJiYgY21kIDw9IFNJT0NJV0xBU1QpKQorCQlyZXQgPSBjb21wYXRfd2V4dF9oYW5kbGVfaW9jdGwobmV0LCBjbWQsIGFyZyk7CisKKwlpZiAocmV0ID09IC1FTk9JT0NUTENNRCkKKwkJcmV0ID0gY29tcGF0X3NvY2tfaW9jdGxfdHJhbnMoZmlsZSwgc29jaywgY21kLCBhcmcpOworCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitpbnQga2VybmVsX2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcmxlbikKK3sKKwlyZXR1cm4gc29jay0+b3BzLT5iaW5kKHNvY2ssIGFkZHIsIGFkZHJsZW4pOworfQorRVhQT1JUX1NZTUJPTChrZXJuZWxfYmluZCk7CisKK2ludCBrZXJuZWxfbGlzdGVuKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBiYWNrbG9nKQoreworCXJldHVybiBzb2NrLT5vcHMtPmxpc3Rlbihzb2NrLCBiYWNrbG9nKTsKK30KK0VYUE9SVF9TWU1CT0woa2VybmVsX2xpc3Rlbik7CisKK2ludCBrZXJuZWxfYWNjZXB0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrZXQgKipuZXdzb2NrLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IGVycjsKKworCWVyciA9IHNvY2tfY3JlYXRlX2xpdGUoc2stPnNrX2ZhbWlseSwgc2stPnNrX3R5cGUsIHNrLT5za19wcm90b2NvbCwKKwkJCSAgICAgICBuZXdzb2NrKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBkb25lOworCisJZXJyID0gc29jay0+b3BzLT5hY2NlcHQoc29jaywgKm5ld3NvY2ssIGZsYWdzKTsKKwlpZiAoZXJyIDwgMCkgeworCQlzb2NrX3JlbGVhc2UoKm5ld3NvY2spOworCQkqbmV3c29jayA9IE5VTEw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkoKm5ld3NvY2spLT5vcHMgPSBzb2NrLT5vcHM7CisJX19tb2R1bGVfZ2V0KCgqbmV3c29jayktPm9wcy0+b3duZXIpOworCitkb25lOgorCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGtlcm5lbF9hY2NlcHQpOworCitpbnQga2VybmVsX2Nvbm5lY3Qoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcmxlbiwKKwkJICAgaW50IGZsYWdzKQoreworCXJldHVybiBzb2NrLT5vcHMtPmNvbm5lY3Qoc29jaywgYWRkciwgYWRkcmxlbiwgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChrZXJuZWxfY29ubmVjdCk7CisKK2ludCBrZXJuZWxfZ2V0c29ja25hbWUoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLAorCQkJIGludCAqYWRkcmxlbikKK3sKKwlyZXR1cm4gc29jay0+b3BzLT5nZXRuYW1lKHNvY2ssIGFkZHIsIGFkZHJsZW4sIDApOworfQorRVhQT1JUX1NZTUJPTChrZXJuZWxfZ2V0c29ja25hbWUpOworCitpbnQga2VybmVsX2dldHBlZXJuYW1lKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkciwKKwkJCSBpbnQgKmFkZHJsZW4pCit7CisJcmV0dXJuIHNvY2stPm9wcy0+Z2V0bmFtZShzb2NrLCBhZGRyLCBhZGRybGVuLCAxKTsKK30KK0VYUE9SVF9TWU1CT0woa2VybmVsX2dldHBlZXJuYW1lKTsKKworaW50IGtlcm5lbF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCQljaGFyICpvcHR2YWwsIGludCAqb3B0bGVuKQoreworCW1tX3NlZ21lbnRfdCBvbGRmcyA9IGdldF9mcygpOworCWNoYXIgX191c2VyICp1b3B0dmFsOworCWludCBfX3VzZXIgKnVvcHRsZW47CisJaW50IGVycjsKKworCXVvcHR2YWwgPSAoY2hhciBfX3VzZXIgX19mb3JjZSAqKSBvcHR2YWw7CisJdW9wdGxlbiA9IChpbnQgX191c2VyIF9fZm9yY2UgKikgb3B0bGVuOworCisJc2V0X2ZzKEtFUk5FTF9EUyk7CisJaWYgKGxldmVsID09IFNPTF9TT0NLRVQpCisJCWVyciA9IHNvY2tfZ2V0c29ja29wdChzb2NrLCBsZXZlbCwgb3B0bmFtZSwgdW9wdHZhbCwgdW9wdGxlbik7CisJZWxzZQorCQllcnIgPSBzb2NrLT5vcHMtPmdldHNvY2tvcHQoc29jaywgbGV2ZWwsIG9wdG5hbWUsIHVvcHR2YWwsCisJCQkJCSAgICB1b3B0bGVuKTsKKwlzZXRfZnMob2xkZnMpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGtlcm5lbF9nZXRzb2Nrb3B0KTsKKworaW50IGtlcm5lbF9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCisJCQljaGFyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCit7CisJbW1fc2VnbWVudF90IG9sZGZzID0gZ2V0X2ZzKCk7CisJY2hhciBfX3VzZXIgKnVvcHR2YWw7CisJaW50IGVycjsKKworCXVvcHR2YWwgPSAoY2hhciBfX3VzZXIgX19mb3JjZSAqKSBvcHR2YWw7CisKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwlpZiAobGV2ZWwgPT0gU09MX1NPQ0tFVCkKKwkJZXJyID0gc29ja19zZXRzb2Nrb3B0KHNvY2ssIGxldmVsLCBvcHRuYW1lLCB1b3B0dmFsLCBvcHRsZW4pOworCWVsc2UKKwkJZXJyID0gc29jay0+b3BzLT5zZXRzb2Nrb3B0KHNvY2ssIGxldmVsLCBvcHRuYW1lLCB1b3B0dmFsLAorCQkJCQkgICAgb3B0bGVuKTsKKwlzZXRfZnMob2xkZnMpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGtlcm5lbF9zZXRzb2Nrb3B0KTsKKworaW50IGtlcm5lbF9zZW5kcGFnZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9mZnNldCwKKwkJICAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJc29ja191cGRhdGVfY2xhc3NpZChzb2NrLT5zayk7CisKKwlpZiAoc29jay0+b3BzLT5zZW5kcGFnZSkKKwkJcmV0dXJuIHNvY2stPm9wcy0+c2VuZHBhZ2Uoc29jaywgcGFnZSwgb2Zmc2V0LCBzaXplLCBmbGFncyk7CisKKwlyZXR1cm4gc29ja19ub19zZW5kcGFnZShzb2NrLCBwYWdlLCBvZmZzZXQsIHNpemUsIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woa2VybmVsX3NlbmRwYWdlKTsKKworaW50IGtlcm5lbF9zb2NrX2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCW1tX3NlZ21lbnRfdCBvbGRmcyA9IGdldF9mcygpOworCWludCBlcnI7CisKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwllcnIgPSBzb2NrLT5vcHMtPmlvY3RsKHNvY2ssIGNtZCwgYXJnKTsKKwlzZXRfZnMob2xkZnMpOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woa2VybmVsX3NvY2tfaW9jdGwpOworCitpbnQga2VybmVsX3NvY2tfc2h1dGRvd24oc3RydWN0IHNvY2tldCAqc29jaywgZW51bSBzb2NrX3NodXRkb3duX2NtZCBob3cpCit7CisJcmV0dXJuIHNvY2stPm9wcy0+c2h1dGRvd24oc29jaywgaG93KTsKK30KK0VYUE9SVF9TWU1CT0woa2VybmVsX3NvY2tfc2h1dGRvd24pOwo=