LyoKICogTFRDMjk1MiAoUG93ZXJQYXRoKSBkcml2ZXIKICoKICogQ29weXJpZ2h0IChDKSAyMDE0LCBYc2VucyBUZWNobm9sb2dpZXMgQlYgPGluZm9AeHNlbnMuY29tPgogKiBNYWludGFpbmVyOiBSZW7pIE1vbGwgPGxpbnV4QHItbW9sbC5ubD4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAtIERlc2NyaXB0aW9uCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogVGhpcyBkcml2ZXIgaXMgdG8gYmUgdXNlZCB3aXRoIGFuIGV4dGVybmFsIFBvd2VyUGF0aCBDb250cm9sbGVyIChMVEMyOTUyKS4KICogSXRzIGZ1bmN0aW9uIGlzIHRvIGRldGVybWluZSB3aGVuIGEgZXh0ZXJuYWwgc2h1dCBkb3duIGlzIHRyaWdnZXJlZAogKiBhbmQgcmVhY3QgYnkgcHJvcGVybHkgc2h1dHRpbmcgZG93biB0aGUgc3lzdGVtLgogKgogKiBUaGlzIGRyaXZlciBleHBlY3RzIGEgZGV2aWNlIHRyZWUgd2l0aCBhIGx0YzI5NTIgZW50cnkgZm9yIHBpbiBtYXBwaW5nLgogKgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIC0gR1BJTwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIFRoZSBmb2xsb3dpbmcgR1BJT3MgYXJlIHVzZWQ6CiAqIC0gdHJpZ2dlciAoaW5wdXQpCiAqICAgICBBIGxldmVsIGNoYW5nZSBpbmRpY2F0ZXMgdGhlIHNodXQtZG93biB0cmlnZ2VyLiBJZiBpdCdzIHN0YXRlIHJldmVydHMKICogICAgIHdpdGhpbiB0aGUgdGltZS1vdXQgZGVmaW5lZCBieSB0cmlnZ2VyX2RlbGF5LCB0aGUgc2h1dCBkb3duIGlzIG5vdAogKiAgICAgZXhlY3V0ZWQuIElmIG5vIHBpbiBpcyBhc3NpZ25lZCB0byB0aGlzIGlucHV0LCB0aGUgZHJpdmVyIHdpbGwgc3RhcnQgdGhlCiAqICAgICB3YXRjaGRvZyB0b2dnbGUgaW1tZWRpYXRlbHkuIFRoZSBjaGlwIHdpbGwgb25seSBwb3dlciBvZmYgdGhlIHN5c3RlbSBpZgogKiAgICAgaXQgaXMgcmVxdWVzdGVkIHRvIGRvIHNvIHRocm91Z2ggdGhlIGtpbGwgbGluZS4KICoKICogLSB3YXRjaGRvZyAob3V0cHV0KQogKiAgICAgT25jZSBhIHNodXQgZG93biBpcyB0cmlnZ2VyZWQsIHRoZSBkcml2ZXIgd2lsbCB0b2dnbGUgdGhpcyBzaWduYWwsCiAqICAgICB3aXRoIGFuIGludGVybmFsICh3ZGVfaW50ZXJ2YWwpIHRvIHN0YWxsIHRoZSBoYXJkd2FyZSBzaHV0IGRvd24uCiAqCiAqIC0ga2lsbCAob3V0cHV0KQogKiAgICAgVGhlIGxhc3QgYWN0aW9uIGR1cmluZyBzaHV0IGRvd24gaXMgdHJpZ2dlcmluZyB0aGlzIHNpZ25hbGxpbmcsIHN1Y2gKICogICAgIHRoYXQgdGhlIFBvd2VyUGF0aCBDb250cm9sIHdpbGwgcG93ZXIgZG93biB0aGUgaGFyZHdhcmUuCiAqCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogLSBJbnRlcnJ1cHRzCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogVGhlIGRyaXZlciByZXF1aXJlcyBhIG5vbi1zaGFyZWQsIGVkZ2UtdHJpZ2dlcmVkIGludGVycnVwdCBvbiB0aGUgdHJpZ2dlcgogKiBHUElPLgogKgogKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2dwaW8vY29uc3VtZXIuaD4KI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgoKc3RydWN0IGx0YzI5NTJfcG93ZXJvZmYgewoJc3RydWN0IGhydGltZXIgdGltZXJfdHJpZ2dlcjsKCXN0cnVjdCBocnRpbWVyIHRpbWVyX3dkZTsKCglrdGltZV90IHRyaWdnZXJfZGVsYXk7CglrdGltZV90IHdkZV9pbnRlcnZhbDsKCglzdHJ1Y3QgZGV2aWNlICpkZXY7CgoJc3RydWN0IGdwaW9fZGVzYyAqZ3Bpb190cmlnZ2VyOwoJc3RydWN0IGdwaW9fZGVzYyAqZ3Bpb193YXRjaGRvZzsKCXN0cnVjdCBncGlvX2Rlc2MgKmdwaW9fa2lsbDsKCglib29sIGtlcm5lbF9wYW5pYzsKCXN0cnVjdCBub3RpZmllcl9ibG9jayBwYW5pY19ub3RpZmllcjsKfTsKCiNkZWZpbmUgdG9fbHRjMjk1MihwLCBtKSBjb250YWluZXJfb2YocCwgc3RydWN0IGx0YzI5NTJfcG93ZXJvZmYsIG0pCgovKgogKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyBvbmx5IG5lZWRlZCBmb3IgcG1fcG93ZXJfb2ZmLiBXZSBzaG91bGQKICogcmVtb3ZlIGl0IGVudGlyZWx5IG9uY2Ugd2UgZG9uJ3QgbmVlZCB0aGUgZ2xvYmFsIHN0YXRlIGFueW1vcmUuCiAqLwpzdGF0aWMgc3RydWN0IGx0YzI5NTJfcG93ZXJvZmYgKmx0YzI5NTJfZGF0YTsKCi8qKgogKiBsdGMyOTUyX3Bvd2Vyb2ZmX3RpbWVyX3dkZSAtIFRpbWVyIGNhbGxiYWNrCiAqIFRvZ2dsZXMgdGhlIHdhdGNoZG9nIHJlc2V0IHNpZ25hbCBlYWNoIHdkZV9pbnRlcnZhbAogKgogKiBAdGltZXI6IGNvcnJlc3BvbmRpbmcgdGltZXIKICoKICogUmV0dXJucyBIUlRJTUVSX1JFU1RBUlQgZm9yIGFuIGluZmluaXRlIGxvb3Agd2hpY2ggd2lsbCBvbmx5IHN0b3Agd2hlbiB0aGUKICogbWFjaGluZSBhY3R1YWxseSBzaHV0cyBkb3duCiAqLwpzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgbHRjMjk1Ml9wb3dlcm9mZl90aW1lcl93ZGUoc3RydWN0IGhydGltZXIgKnRpbWVyKQp7CglrdGltZV90IG5vdzsKCWludCBzdGF0ZTsKCXVuc2lnbmVkIGxvbmcgb3ZlcnJ1bnM7CglzdHJ1Y3QgbHRjMjk1Ml9wb3dlcm9mZiAqZGF0YSA9IHRvX2x0YzI5NTIodGltZXIsIHRpbWVyX3dkZSk7CgoJaWYgKGRhdGEtPmtlcm5lbF9wYW5pYykKCQlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7CgoJc3RhdGUgPSBncGlvZF9nZXRfdmFsdWUoZGF0YS0+Z3Bpb193YXRjaGRvZyk7CglncGlvZF9zZXRfdmFsdWUoZGF0YS0+Z3Bpb193YXRjaGRvZywgIXN0YXRlKTsKCglub3cgPSBocnRpbWVyX2NiX2dldF90aW1lKHRpbWVyKTsKCW92ZXJydW5zID0gaHJ0aW1lcl9mb3J3YXJkKHRpbWVyLCBub3csIGRhdGEtPndkZV9pbnRlcnZhbCk7CgoJcmV0dXJuIEhSVElNRVJfUkVTVEFSVDsKfQoKc3RhdGljIHZvaWQgbHRjMjk1Ml9wb3dlcm9mZl9zdGFydF93ZGUoc3RydWN0IGx0YzI5NTJfcG93ZXJvZmYgKmRhdGEpCnsKCWlmIChocnRpbWVyX3N0YXJ0KCZkYXRhLT50aW1lcl93ZGUsIGRhdGEtPndkZV9pbnRlcnZhbCwKCQkJICBIUlRJTUVSX01PREVfUkVMKSkgewoJCS8qCgkJICogVGhlIGRldmljZSB3aWxsIG5vdCB0b2dnbGUgdGhlIHdhdGNoZG9nIHJlc2V0LAoJCSAqIHRodXMgc2h1dCBkb3duIGlzIG9ubHkgc2FmZSBpZiB0aGUgUG93ZXJQYXRoIGNvbnRyb2xsZXIKCQkgKiBoYXMgYSBsb25nIGVub3VnaCB0aW1lLW9mZiBiZWZvcmUgdHJpZ2dlcmluZyBhIGhhcmR3YXJlCgkJICogcG93ZXItb2ZmLgoJCSAqCgkJICogT25seSBzZW5kaW5nIGEgd2FybmluZyBhcyB0aGUgc3lzdGVtIHdpbGwgcG93ZXItb2ZmIGFueXdheQoJCSAqLwoJCWRldl9lcnIoZGF0YS0+ZGV2LCAidW5hYmxlIHRvIHN0YXJ0IHRoZSB0aW1lclxuIik7Cgl9Cn0KCnN0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydApsdGMyOTUyX3Bvd2Vyb2ZmX3RpbWVyX3RyaWdnZXIoc3RydWN0IGhydGltZXIgKnRpbWVyKQp7CglzdHJ1Y3QgbHRjMjk1Ml9wb3dlcm9mZiAqZGF0YSA9IHRvX2x0YzI5NTIodGltZXIsIHRpbWVyX3RyaWdnZXIpOwoKCWx0YzI5NTJfcG93ZXJvZmZfc3RhcnRfd2RlKGRhdGEpOwoJZGV2X2luZm8oZGF0YS0+ZGV2LCAiZXhlY3V0aW5nIHNodXRkb3duXG4iKTsKCW9yZGVybHlfcG93ZXJvZmYodHJ1ZSk7CgoJcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOwp9CgovKioKICogbHRjMjk1Ml9wb3dlcm9mZl9oYW5kbGVyIC0gSW50ZXJydXB0IGhhbmRsZXIKICogVHJpZ2dlcmVkIGVhY2ggdGltZSB0aGUgdHJpZ2dlciBzaWduYWwgY2hhbmdlcyBzdGF0ZSBhbmQgKGRlKWFjdGl2YXRlcyBhCiAqIHRpbWUtb3V0ICh0aW1lcl90cmlnZ2VyKS4gT25jZSB0aGUgdGltZS1vdXQgaXMgYWN0dWFsbHkgcmVhY2hlZCB0aGUgc2h1dAogKiBkb3duIGlzIGV4ZWN1dGVkLgogKgogKiBAaXJxOiBJUlEgbnVtYmVyCiAqIEBkZXZfaWQ6IHBvaW50ZXIgdG8gdGhlIG1haW4gZGF0YSBzdHJ1Y3R1cmUKICovCnN0YXRpYyBpcnFyZXR1cm5fdCBsdGMyOTUyX3Bvd2Vyb2ZmX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQp7CglzdHJ1Y3QgbHRjMjk1Ml9wb3dlcm9mZiAqZGF0YSA9IGRldl9pZDsKCglpZiAoZGF0YS0+a2VybmVsX3BhbmljIHx8IGhydGltZXJfYWN0aXZlKCZkYXRhLT50aW1lcl93ZGUpKSB7CgkJLyogc2h1dGRvd24gaXMgYWxyZWFkeSB0cmlnZ2VyZWQsIG5vdGhpbmcgdG8gZG8gYW55IG1vcmUgKi8KCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Cgl9CgoJaWYgKGdwaW9kX2dldF92YWx1ZShkYXRhLT5ncGlvX3RyaWdnZXIpKSB7CgkJaWYgKGhydGltZXJfc3RhcnQoJmRhdGEtPnRpbWVyX3RyaWdnZXIsIGRhdGEtPnRyaWdnZXJfZGVsYXksCgkJCQkgIEhSVElNRVJfTU9ERV9SRUwpKQoJCQlkZXZfZXJyKGRhdGEtPmRldiwgInVuYWJsZSB0byBzdGFydCB0aGUgd2FpdCB0aW1lclxuIik7Cgl9IGVsc2UgewoJCWhydGltZXJfY2FuY2VsKCZkYXRhLT50aW1lcl90cmlnZ2VyKTsKCQkvKiBvbWl0dGluZyByZXR1cm4gdmFsdWUgY2hlY2ssIHRpbWVyIHNob3VsZCBoYXZlIGJlZW4gdmFsaWQgKi8KCX0KCXJldHVybiBJUlFfSEFORExFRDsKfQoKc3RhdGljIHZvaWQgbHRjMjk1Ml9wb3dlcm9mZl9raWxsKHZvaWQpCnsKCWdwaW9kX3NldF92YWx1ZShsdGMyOTUyX2RhdGEtPmdwaW9fa2lsbCwgMSk7Cn0KCnN0YXRpYyB2b2lkIGx0YzI5NTJfcG93ZXJvZmZfZGVmYXVsdChzdHJ1Y3QgbHRjMjk1Ml9wb3dlcm9mZiAqZGF0YSkKewoJZGF0YS0+d2RlX2ludGVydmFsID0ga3RpbWVfc2V0KDAsIDMwMEwqMUU2TCk7CglkYXRhLT50cmlnZ2VyX2RlbGF5ID0ga3RpbWVfc2V0KDIsIDUwMEwqMUU2TCk7CgoJaHJ0aW1lcl9pbml0KCZkYXRhLT50aW1lcl90cmlnZ2VyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOwoJZGF0YS0+dGltZXJfdHJpZ2dlci5mdW5jdGlvbiA9IGx0YzI5NTJfcG93ZXJvZmZfdGltZXJfdHJpZ2dlcjsKCglocnRpbWVyX2luaXQoJmRhdGEtPnRpbWVyX3dkZSwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKCWRhdGEtPnRpbWVyX3dkZS5mdW5jdGlvbiA9IGx0YzI5NTJfcG93ZXJvZmZfdGltZXJfd2RlOwp9CgpzdGF0aWMgaW50IGx0YzI5NTJfcG93ZXJvZmZfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQp7CglpbnQgcmV0OwoJc3RydWN0IGx0YzI5NTJfcG93ZXJvZmYgKmRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKCglsdGMyOTUyX3Bvd2Vyb2ZmX2RlZmF1bHQoZGF0YSk7CgoJZGF0YS0+Z3Bpb193YXRjaGRvZyA9IGRldm1fZ3Bpb2RfZ2V0KCZwZGV2LT5kZXYsICJ3YXRjaGRvZyIsCgkJCQkJICAgICBHUElPRF9PVVRfTE9XKTsKCWlmIChJU19FUlIoZGF0YS0+Z3Bpb193YXRjaGRvZykpIHsKCQlyZXQgPSBQVFJfRVJSKGRhdGEtPmdwaW9fd2F0Y2hkb2cpOwoJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBjbGFpbSBncGlvIFwid2F0Y2hkb2dcIlxuIik7CgkJcmV0dXJuIHJldDsKCX0KCglkYXRhLT5ncGlvX2tpbGwgPSBkZXZtX2dwaW9kX2dldCgmcGRldi0+ZGV2LCAia2lsbCIsIEdQSU9EX09VVF9MT1cpOwoJaWYgKElTX0VSUihkYXRhLT5ncGlvX2tpbGwpKSB7CgkJcmV0ID0gUFRSX0VSUihkYXRhLT5ncGlvX2tpbGwpOwoJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBjbGFpbSBncGlvIFwia2lsbFwiXG4iKTsKCQlyZXR1cm4gcmV0OwoJfQoKCWRhdGEtPmdwaW9fdHJpZ2dlciA9IGRldm1fZ3Bpb2RfZ2V0KCZwZGV2LT5kZXYsICJ0cmlnZ2VyIiwgR1BJT0RfSU4pOwoJaWYgKElTX0VSUihkYXRhLT5ncGlvX3RyaWdnZXIpKSB7CgkJLyoKCQkgKiBJdCdzIG5vdCBhIHByb2JsZW0gaWYgdGhlIHRyaWdnZXIgZ3BpbyBpc24ndCBhdmFpbGFibGUsIGJ1dAoJCSAqIGl0IGlzIHdvcnRoIGEgd2FybmluZyBpZiBpdHMgdXNlIHdhcyBkZWZpbmVkIGluIHRoZSBkZXZpY2UKCQkgKiB0cmVlLgoJCSAqLwoJCWlmIChQVFJfRVJSKGRhdGEtPmdwaW9fdHJpZ2dlcikgIT0gLUVOT0VOVCkKCQkJZGV2X2VycigmcGRldi0+ZGV2LAoJCQkJInVuYWJsZSB0byBjbGFpbSBncGlvIFwidHJpZ2dlclwiXG4iKTsKCQlkYXRhLT5ncGlvX3RyaWdnZXIgPSBOVUxMOwoJfQoKCWlmIChkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGdwaW9kX3RvX2lycShkYXRhLT5ncGlvX3RyaWdnZXIpLAoJCQkgICAgIGx0YzI5NTJfcG93ZXJvZmZfaGFuZGxlciwKCQkJICAgICAoSVJRRl9UUklHR0VSX0ZBTExJTkcgfCBJUlFGX1RSSUdHRVJfUklTSU5HKSwKCQkJICAgICAibHRjMjk1Mi1wb3dlcm9mZiIsCgkJCSAgICAgZGF0YSkpIHsKCQkvKgoJCSAqIFNvbWUgdGhpbmdzIG1heSBoYXZlIGhhcHBlbmVkOgoJCSAqIC0gTm8gdHJpZ2dlciBpbnB1dCB3YXMgZGVmaW5lZAoJCSAqIC0gQ2xhaW1pbmcgdGhlIEdQSU8gZmFpbGVkCgkJICogLSBXZSBjb3VsZCBub3QgbWFwIHRvIGFuIElSUQoJCSAqIC0gV2UgY291bGRuJ3QgcmVnaXN0ZXIgYW4gaW50ZXJydXB0IGhhbmRsZXIKCQkgKgoJCSAqIE5vbmUgb2YgdGhlc2UgcmVhbGx5IGFyZSBwcm9ibGVtcywgYnV0IGFsbCBvZiB0aGVtCgkJICogZGlzcXVhbGlmeSB0aGUgcHVzaCBidXR0b24gZnJvbSBjb250cm9sbGluZyB0aGUgcG93ZXIuCgkJICoKCQkgKiBJdCBpcyB0aGVyZWZvcmUgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBpZiB0aGUgbHRjMjk1MgoJCSAqIGRldGVjdHMgYSBidXR0b24gcHJlc3MgZm9yIGxvbmcgZW5vdWdoLCBpdCB3aWxsIHN0aWxsIHN0YXJ0CgkJICogaXRzIG93biBwb3dlcmRvd24gd2luZG93IGFuZCBjdXQgdGhlIHBvd2VyIG9uIHVzIGlmIHdlIGRvbid0CgkJICogc3RhcnQgdGhlIHdhdGNoZG9nIHRyaWdnZXIuCgkJICovCgkJaWYgKGRhdGEtPmdwaW9fdHJpZ2dlcikgewoJCQlkZXZfd2FybigmcGRldi0+ZGV2LAoJCQkJICJ1bmFibGUgdG8gY29uZmlndXJlIHRoZSB0cmlnZ2VyIGludGVycnVwdFxuIik7CgkJCWRldm1fZ3Bpb2RfcHV0KCZwZGV2LT5kZXYsIGRhdGEtPmdwaW9fdHJpZ2dlcik7CgkJCWRhdGEtPmdwaW9fdHJpZ2dlciA9IE5VTEw7CgkJfQoJCWRldl9pbmZvKCZwZGV2LT5kZXYsCgkJCSAicG93ZXIgZG93biB0cmlnZ2VyIGlucHV0IHdpbGwgbm90IGJlIHVzZWRcbiIpOwoJCWx0YzI5NTJfcG93ZXJvZmZfc3RhcnRfd2RlKGRhdGEpOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGx0YzI5NTJfcG93ZXJvZmZfbm90aWZ5X3BhbmljKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCgkJCQkJIHVuc2lnbmVkIGxvbmcgY29kZSwgdm9pZCAqdW51c2VkKQp7CglzdHJ1Y3QgbHRjMjk1Ml9wb3dlcm9mZiAqZGF0YSA9IHRvX2x0YzI5NTIobmIsIHBhbmljX25vdGlmaWVyKTsKCglkYXRhLT5rZXJuZWxfcGFuaWMgPSB0cnVlOwoJcmV0dXJuIE5PVElGWV9ET05FOwp9CgpzdGF0aWMgaW50IGx0YzI5NTJfcG93ZXJvZmZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKewoJaW50IHJldDsKCXN0cnVjdCBsdGMyOTUyX3Bvd2Vyb2ZmICpkYXRhOwoKCWlmIChwbV9wb3dlcl9vZmYpIHsKCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwbV9wb3dlcl9vZmYgYWxyZWFkeSByZWdpc3RlcmVkIik7CgkJcmV0dXJuIC1FQlVTWTsKCX0KCglkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOwoJaWYgKCFkYXRhKQoJCXJldHVybiAtRU5PTUVNOwoKCWRhdGEtPmRldiA9ICZwZGV2LT5kZXY7CglwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkYXRhKTsKCglyZXQgPSBsdGMyOTUyX3Bvd2Vyb2ZmX2luaXQocGRldik7CglpZiAocmV0KQoJCXJldHVybiByZXQ7CgoJLyogVE9ETzogcmVtb3ZlIGx0YzI5NTJfZGF0YSAqLwoJbHRjMjk1Ml9kYXRhID0gZGF0YTsKCXBtX3Bvd2VyX29mZiA9IGx0YzI5NTJfcG93ZXJvZmZfa2lsbDsKCglkYXRhLT5wYW5pY19ub3RpZmllci5ub3RpZmllcl9jYWxsID0gbHRjMjk1Ml9wb3dlcm9mZl9ub3RpZnlfcGFuaWM7CglhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsCgkJCQkgICAgICAgJmRhdGEtPnBhbmljX25vdGlmaWVyKTsKCWRldl9pbmZvKCZwZGV2LT5kZXYsICJwcm9iZSBzdWNjZXNzZnVsXG4iKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBsdGMyOTUyX3Bvd2Vyb2ZmX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQp7CglzdHJ1Y3QgbHRjMjk1Ml9wb3dlcm9mZiAqZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwoKCXBtX3Bvd2VyX29mZiA9IE5VTEw7CglocnRpbWVyX2NhbmNlbCgmZGF0YS0+dGltZXJfdHJpZ2dlcik7CglocnRpbWVyX2NhbmNlbCgmZGF0YS0+dGltZXJfd2RlKTsKCWF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LAoJCQkJCSAmZGF0YS0+cGFuaWNfbm90aWZpZXIpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX2x0YzI5NTJfcG93ZXJvZmZfbWF0Y2hbXSA9IHsKCXsgLmNvbXBhdGlibGUgPSAibGx0YyxsdGMyOTUyIn0sCgl7fSwKfTsKTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb2ZfbHRjMjk1Ml9wb3dlcm9mZl9tYXRjaCk7CgpzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBsdGMyOTUyX3Bvd2Vyb2ZmX2RyaXZlciA9IHsKCS5wcm9iZSA9IGx0YzI5NTJfcG93ZXJvZmZfcHJvYmUsCgkucmVtb3ZlID0gbHRjMjk1Ml9wb3dlcm9mZl9yZW1vdmUsCgkuZHJpdmVyID0gewoJCS5uYW1lID0gImx0YzI5NTItcG93ZXJvZmYiLAoJCS5vZl9tYXRjaF90YWJsZSA9IG9mX2x0YzI5NTJfcG93ZXJvZmZfbWF0Y2gsCgl9LAp9OwoKbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihsdGMyOTUyX3Bvd2Vyb2ZmX2RyaXZlcik7CgpNT0RVTEVfQVVUSE9SKCJSZW7pIE1vbGwgPHJlbmUubW9sbEB4c2Vucy5jb20+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiTFRDIFBvd2VyUGF0aCBwb3dlci1vZmYgZHJpdmVyIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsK