LyoKICogTFRDMjk1MiAoUG93ZXJQYXRoKSBkcml2ZXIKICoKICogQ29weXJpZ2h0IChDKSAyMDE0LCBYc2VucyBUZWNobm9sb2dpZXMgQlYgPGluZm9AeHNlbnMuY29tPgogKiBNYWludGFpbmVyOiBSZW7pIE1vbGwgPGxpbnV4QHItbW9sbC5ubD4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAtIERlc2NyaXB0aW9uCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogVGhpcyBkcml2ZXIgaXMgdG8gYmUgdXNlZCB3aXRoIGFuIGV4dGVybmFsIFBvd2VyUGF0aCBDb250cm9sbGVyIChMVEMyOTUyKS4KICogSXRzIGZ1bmN0aW9uIGlzIHRvIGRldGVybWluZSB3aGVuIGEgZXh0ZXJuYWwgc2h1dCBkb3duIGlzIHRyaWdnZXJlZAogKiBhbmQgcmVhY3QgYnkgcHJvcGVybHkgc2h1dHRpbmcgZG93biB0aGUgc3lzdGVtLgogKgogKiBUaGlzIGRyaXZlciBleHBlY3RzIGEgZGV2aWNlIHRyZWUgd2l0aCBhIGx0YzI5NTIgZW50cnkgZm9yIHBpbiBtYXBwaW5nLgogKgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIC0gR1BJTwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIFRoZSBmb2xsb3dpbmcgR1BJT3MgYXJlIHVzZWQ6CiAqIC0gdHJpZ2dlciAoaW5wdXQpCiAqICAgICBBIGxldmVsIGNoYW5nZSBpbmRpY2F0ZXMgdGhlIHNodXQtZG93biB0cmlnZ2VyLiBJZiBpdCdzIHN0YXRlIHJldmVydHMKICogICAgIHdpdGhpbiB0aGUgdGltZS1vdXQgZGVmaW5lZCBieSB0cmlnZ2VyX2RlbGF5LCB0aGUgc2h1dCBkb3duIGlzIG5vdAogKiAgICAgZXhlY3V0ZWQuIElmIG5vIHBpbiBpcyBhc3NpZ25lZCB0byB0aGlzIGlucHV0LCB0aGUgZHJpdmVyIHdpbGwgc3RhcnQgdGhlCiAqICAgICB3YXRjaGRvZyB0b2dnbGUgaW1tZWRpYXRlbHkuIFRoZSBjaGlwIHdpbGwgb25seSBwb3dlciBvZmYgdGhlIHN5c3RlbSBpZgogKiAgICAgaXQgaXMgcmVxdWVzdGVkIHRvIGRvIHNvIHRocm91Z2ggdGhlIGtpbGwgbGluZS4KICoKICogLSB3YXRjaGRvZyAob3V0cHV0KQogKiAgICAgT25jZSBhIHNodXQgZG93biBpcyB0cmlnZ2VyZWQsIHRoZSBkcml2ZXIgd2lsbCB0b2dnbGUgdGhpcyBzaWduYWwsCiAqICAgICB3aXRoIGFuIGludGVybmFsICh3ZGVfaW50ZXJ2YWwpIHRvIHN0YWxsIHRoZSBoYXJkd2FyZSBzaHV0IGRvd24uCiAqCiAqIC0ga2lsbCAob3V0cHV0KQogKiAgICAgVGhlIGxhc3QgYWN0aW9uIGR1cmluZyBzaHV0IGRvd24gaXMgdHJpZ2dlcmluZyB0aGlzIHNpZ25hbGxpbmcsIHN1Y2gKICogICAgIHRoYXQgdGhlIFBvd2VyUGF0aCBDb250cm9sIHdpbGwgcG93ZXIgZG93biB0aGUgaGFyZHdhcmUuCiAqCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogLSBJbnRlcnJ1cHRzCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogVGhlIGRyaXZlciByZXF1aXJlcyBhIG5vbi1zaGFyZWQsIGVkZ2UtdHJpZ2dlcmVkIGludGVycnVwdCBvbiB0aGUgdHJpZ2dlcgogKiBHUElPLgogKgogKi8KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2dwaW8vY29uc3VtZXIuaD4KI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgoKc3RydWN0IGx0YzI5NTJfcG93ZXJvZmYgewoJc3RydWN0IGhydGltZXIgdGltZXJfdHJpZ2dlcjsKCXN0cnVjdCBocnRpbWVyIHRpbWVyX3dkZTsKCglrdGltZV90IHRyaWdnZXJfZGVsYXk7CglrdGltZV90IHdkZV9pbnRlcnZhbDsKCglzdHJ1Y3QgZGV2aWNlICpkZXY7CgoJc3RydWN0IGdwaW9fZGVzYyAqZ3Bpb190cmlnZ2VyOwoJc3RydWN0IGdwaW9fZGVzYyAqZ3Bpb193YXRjaGRvZzsKCXN0cnVjdCBncGlvX2Rlc2MgKmdwaW9fa2lsbDsKCglib29sIGtlcm5lbF9wYW5pYzsKCXN0cnVjdCBub3RpZmllcl9ibG9jayBwYW5pY19ub3RpZmllcjsKfTsKCiNkZWZpbmUgdG9fbHRjMjk1MihwLCBtKSBjb250YWluZXJfb2YocCwgc3RydWN0IGx0YzI5NTJfcG93ZXJvZmYsIG0pCgovKgogKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyBvbmx5IG5lZWRlZCBmb3IgcG1fcG93ZXJfb2ZmLiBXZSBzaG91bGQKICogcmVtb3ZlIGl0IGVudGlyZWx5IG9uY2Ugd2UgZG9uJ3QgbmVlZCB0aGUgZ2xvYmFsIHN0YXRlIGFueW1vcmUuCiAqLwpzdGF0aWMgc3RydWN0IGx0YzI5NTJfcG93ZXJvZmYgKmx0YzI5NTJfZGF0YTsKCi8qKgogKiBsdGMyOTUyX3Bvd2Vyb2ZmX3RpbWVyX3dkZSAtIFRpbWVyIGNhbGxiYWNrCiAqIFRvZ2dsZXMgdGhlIHdhdGNoZG9nIHJlc2V0IHNpZ25hbCBlYWNoIHdkZV9pbnRlcnZhbAogKgogKiBAdGltZXI6IGNvcnJlc3BvbmRpbmcgdGltZXIKICoKICogUmV0dXJucyBIUlRJTUVSX1JFU1RBUlQgZm9yIGFuIGluZmluaXRlIGxvb3Agd2hpY2ggd2lsbCBvbmx5IHN0b3Agd2hlbiB0aGUKICogbWFjaGluZSBhY3R1YWxseSBzaHV0cyBkb3duCiAqLwpzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgbHRjMjk1Ml9wb3dlcm9mZl90aW1lcl93ZGUoc3RydWN0IGhydGltZXIgKnRpbWVyKQp7CglrdGltZV90IG5vdzsKCWludCBzdGF0ZTsKCXVuc2lnbmVkIGxvbmcgb3ZlcnJ1bnM7CglzdHJ1Y3QgbHRjMjk1Ml9wb3dlcm9mZiAqZGF0YSA9IHRvX2x0YzI5NTIodGltZXIsIHRpbWVyX3dkZSk7CgoJaWYgKGRhdGEtPmtlcm5lbF9wYW5pYykKCQlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7CgoJc3RhdGUgPSBncGlvZF9nZXRfdmFsdWUoZGF0YS0+Z3Bpb193YXRjaGRvZyk7CglncGlvZF9zZXRfdmFsdWUoZGF0YS0+Z3Bpb193YXRjaGRvZywgIXN0YXRlKTsKCglub3cgPSBocnRpbWVyX2NiX2dldF90aW1lKHRpbWVyKTsKCW92ZXJydW5zID0gaHJ0aW1lcl9mb3J3YXJkKHRpbWVyLCBub3csIGRhdGEtPndkZV9pbnRlcnZhbCk7CgoJcmV0dXJuIEhSVElNRVJfUkVTVEFSVDsKfQoKc3RhdGljIHZvaWQgbHRjMjk1Ml9wb3dlcm9mZl9zdGFydF93ZGUoc3RydWN0IGx0YzI5NTJfcG93ZXJvZmYgKmRhdGEpCnsKCWhydGltZXJfc3RhcnQoJmRhdGEtPnRpbWVyX3dkZSwgZGF0YS0+d2RlX2ludGVydmFsLCBIUlRJTUVSX01PREVfUkVMKTsKfQoKc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0Cmx0YzI5NTJfcG93ZXJvZmZfdGltZXJfdHJpZ2dlcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCnsKCXN0cnVjdCBsdGMyOTUyX3Bvd2Vyb2ZmICpkYXRhID0gdG9fbHRjMjk1Mih0aW1lciwgdGltZXJfdHJpZ2dlcik7CgoJbHRjMjk1Ml9wb3dlcm9mZl9zdGFydF93ZGUoZGF0YSk7CglkZXZfaW5mbyhkYXRhLT5kZXYsICJleGVjdXRpbmcgc2h1dGRvd25cbiIpOwoJb3JkZXJseV9wb3dlcm9mZih0cnVlKTsKCglyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Cn0KCi8qKgogKiBsdGMyOTUyX3Bvd2Vyb2ZmX2hhbmRsZXIgLSBJbnRlcnJ1cHQgaGFuZGxlcgogKiBUcmlnZ2VyZWQgZWFjaCB0aW1lIHRoZSB0cmlnZ2VyIHNpZ25hbCBjaGFuZ2VzIHN0YXRlIGFuZCAoZGUpYWN0aXZhdGVzIGEKICogdGltZS1vdXQgKHRpbWVyX3RyaWdnZXIpLiBPbmNlIHRoZSB0aW1lLW91dCBpcyBhY3R1YWxseSByZWFjaGVkIHRoZSBzaHV0CiAqIGRvd24gaXMgZXhlY3V0ZWQuCiAqCiAqIEBpcnE6IElSUSBudW1iZXIKICogQGRldl9pZDogcG9pbnRlciB0byB0aGUgbWFpbiBkYXRhIHN0cnVjdHVyZQogKi8Kc3RhdGljIGlycXJldHVybl90IGx0YzI5NTJfcG93ZXJvZmZfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCnsKCXN0cnVjdCBsdGMyOTUyX3Bvd2Vyb2ZmICpkYXRhID0gZGV2X2lkOwoKCWlmIChkYXRhLT5rZXJuZWxfcGFuaWMgfHwgaHJ0aW1lcl9hY3RpdmUoJmRhdGEtPnRpbWVyX3dkZSkpIHsKCQkvKiBzaHV0ZG93biBpcyBhbHJlYWR5IHRyaWdnZXJlZCwgbm90aGluZyB0byBkbyBhbnkgbW9yZSAqLwoJCXJldHVybiBJUlFfSEFORExFRDsKCX0KCglpZiAoZ3Bpb2RfZ2V0X3ZhbHVlKGRhdGEtPmdwaW9fdHJpZ2dlcikpIHsKCQlocnRpbWVyX3N0YXJ0KCZkYXRhLT50aW1lcl90cmlnZ2VyLCBkYXRhLT50cmlnZ2VyX2RlbGF5LAoJCQkgICAgICBIUlRJTUVSX01PREVfUkVMKTsKCX0gZWxzZSB7CgkJaHJ0aW1lcl9jYW5jZWwoJmRhdGEtPnRpbWVyX3RyaWdnZXIpOwoJfQoJcmV0dXJuIElSUV9IQU5ETEVEOwp9CgpzdGF0aWMgdm9pZCBsdGMyOTUyX3Bvd2Vyb2ZmX2tpbGwodm9pZCkKewoJZ3Bpb2Rfc2V0X3ZhbHVlKGx0YzI5NTJfZGF0YS0+Z3Bpb19raWxsLCAxKTsKfQoKc3RhdGljIHZvaWQgbHRjMjk1Ml9wb3dlcm9mZl9kZWZhdWx0KHN0cnVjdCBsdGMyOTUyX3Bvd2Vyb2ZmICpkYXRhKQp7CglkYXRhLT53ZGVfaW50ZXJ2YWwgPSBrdGltZV9zZXQoMCwgMzAwTCoxRTZMKTsKCWRhdGEtPnRyaWdnZXJfZGVsYXkgPSBrdGltZV9zZXQoMiwgNTAwTCoxRTZMKTsKCglocnRpbWVyX2luaXQoJmRhdGEtPnRpbWVyX3RyaWdnZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CglkYXRhLT50aW1lcl90cmlnZ2VyLmZ1bmN0aW9uID0gbHRjMjk1Ml9wb3dlcm9mZl90aW1lcl90cmlnZ2VyOwoKCWhydGltZXJfaW5pdCgmZGF0YS0+dGltZXJfd2RlLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOwoJZGF0YS0+dGltZXJfd2RlLmZ1bmN0aW9uID0gbHRjMjk1Ml9wb3dlcm9mZl90aW1lcl93ZGU7Cn0KCnN0YXRpYyBpbnQgbHRjMjk1Ml9wb3dlcm9mZl9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCnsKCWludCByZXQ7CglzdHJ1Y3QgbHRjMjk1Ml9wb3dlcm9mZiAqZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwoKCWx0YzI5NTJfcG93ZXJvZmZfZGVmYXVsdChkYXRhKTsKCglkYXRhLT5ncGlvX3dhdGNoZG9nID0gZGV2bV9ncGlvZF9nZXQoJnBkZXYtPmRldiwgIndhdGNoZG9nIiwKCQkJCQkgICAgIEdQSU9EX09VVF9MT1cpOwoJaWYgKElTX0VSUihkYXRhLT5ncGlvX3dhdGNoZG9nKSkgewoJCXJldCA9IFBUUl9FUlIoZGF0YS0+Z3Bpb193YXRjaGRvZyk7CgkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGNsYWltIGdwaW8gXCJ3YXRjaGRvZ1wiXG4iKTsKCQlyZXR1cm4gcmV0OwoJfQoKCWRhdGEtPmdwaW9fa2lsbCA9IGRldm1fZ3Bpb2RfZ2V0KCZwZGV2LT5kZXYsICJraWxsIiwgR1BJT0RfT1VUX0xPVyk7CglpZiAoSVNfRVJSKGRhdGEtPmdwaW9fa2lsbCkpIHsKCQlyZXQgPSBQVFJfRVJSKGRhdGEtPmdwaW9fa2lsbCk7CgkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGNsYWltIGdwaW8gXCJraWxsXCJcbiIpOwoJCXJldHVybiByZXQ7Cgl9CgoJZGF0YS0+Z3Bpb190cmlnZ2VyID0gZGV2bV9ncGlvZF9nZXRfb3B0aW9uYWwoJnBkZXYtPmRldiwgInRyaWdnZXIiLAoJCQkJCQkgICAgIEdQSU9EX0lOKTsKCWlmIChJU19FUlIoZGF0YS0+Z3Bpb190cmlnZ2VyKSkgewoJCS8qCgkJICogSXQncyBub3QgYSBwcm9ibGVtIGlmIHRoZSB0cmlnZ2VyIGdwaW8gaXNuJ3QgYXZhaWxhYmxlLCBidXQKCQkgKiBpdCBpcyB3b3J0aCBhIHdhcm5pbmcgaWYgaXRzIHVzZSB3YXMgZGVmaW5lZCBpbiB0aGUgZGV2aWNlCgkJICogdHJlZS4KCQkgKi8KCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gY2xhaW0gZ3BpbyBcInRyaWdnZXJcIlxuIik7CgkJZGF0YS0+Z3Bpb190cmlnZ2VyID0gTlVMTDsKCX0KCglpZiAoZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBncGlvZF90b19pcnEoZGF0YS0+Z3Bpb190cmlnZ2VyKSwKCQkJICAgICBsdGMyOTUyX3Bvd2Vyb2ZmX2hhbmRsZXIsCgkJCSAgICAgKElSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9UUklHR0VSX1JJU0lORyksCgkJCSAgICAgImx0YzI5NTItcG93ZXJvZmYiLAoJCQkgICAgIGRhdGEpKSB7CgkJLyoKCQkgKiBTb21lIHRoaW5ncyBtYXkgaGF2ZSBoYXBwZW5lZDoKCQkgKiAtIE5vIHRyaWdnZXIgaW5wdXQgd2FzIGRlZmluZWQKCQkgKiAtIENsYWltaW5nIHRoZSBHUElPIGZhaWxlZAoJCSAqIC0gV2UgY291bGQgbm90IG1hcCB0byBhbiBJUlEKCQkgKiAtIFdlIGNvdWxkbid0IHJlZ2lzdGVyIGFuIGludGVycnVwdCBoYW5kbGVyCgkJICoKCQkgKiBOb25lIG9mIHRoZXNlIHJlYWxseSBhcmUgcHJvYmxlbXMsIGJ1dCBhbGwgb2YgdGhlbQoJCSAqIGRpc3F1YWxpZnkgdGhlIHB1c2ggYnV0dG9uIGZyb20gY29udHJvbGxpbmcgdGhlIHBvd2VyLgoJCSAqCgkJICogSXQgaXMgdGhlcmVmb3JlIGltcG9ydGFudCB0byBub3RlIHRoYXQgaWYgdGhlIGx0YzI5NTIKCQkgKiBkZXRlY3RzIGEgYnV0dG9uIHByZXNzIGZvciBsb25nIGVub3VnaCwgaXQgd2lsbCBzdGlsbCBzdGFydAoJCSAqIGl0cyBvd24gcG93ZXJkb3duIHdpbmRvdyBhbmQgY3V0IHRoZSBwb3dlciBvbiB1cyBpZiB3ZSBkb24ndAoJCSAqIHN0YXJ0IHRoZSB3YXRjaGRvZyB0cmlnZ2VyLgoJCSAqLwoJCWlmIChkYXRhLT5ncGlvX3RyaWdnZXIpIHsKCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwKCQkJCSAidW5hYmxlIHRvIGNvbmZpZ3VyZSB0aGUgdHJpZ2dlciBpbnRlcnJ1cHRcbiIpOwoJCQlkZXZtX2dwaW9kX3B1dCgmcGRldi0+ZGV2LCBkYXRhLT5ncGlvX3RyaWdnZXIpOwoJCQlkYXRhLT5ncGlvX3RyaWdnZXIgPSBOVUxMOwoJCX0KCQlkZXZfaW5mbygmcGRldi0+ZGV2LAoJCQkgInBvd2VyIGRvd24gdHJpZ2dlciBpbnB1dCB3aWxsIG5vdCBiZSB1c2VkXG4iKTsKCQlsdGMyOTUyX3Bvd2Vyb2ZmX3N0YXJ0X3dkZShkYXRhKTsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBsdGMyOTUyX3Bvd2Vyb2ZmX25vdGlmeV9wYW5pYyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAoJCQkJCSB1bnNpZ25lZCBsb25nIGNvZGUsIHZvaWQgKnVudXNlZCkKewoJc3RydWN0IGx0YzI5NTJfcG93ZXJvZmYgKmRhdGEgPSB0b19sdGMyOTUyKG5iLCBwYW5pY19ub3RpZmllcik7CgoJZGF0YS0+a2VybmVsX3BhbmljID0gdHJ1ZTsKCXJldHVybiBOT1RJRllfRE9ORTsKfQoKc3RhdGljIGludCBsdGMyOTUyX3Bvd2Vyb2ZmX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCnsKCWludCByZXQ7CglzdHJ1Y3QgbHRjMjk1Ml9wb3dlcm9mZiAqZGF0YTsKCglpZiAocG1fcG93ZXJfb2ZmKSB7CgkJZGV2X2VycigmcGRldi0+ZGV2LCAicG1fcG93ZXJfb2ZmIGFscmVhZHkgcmVnaXN0ZXJlZCIpOwoJCXJldHVybiAtRUJVU1k7Cgl9CgoJZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKCWlmICghZGF0YSkKCQlyZXR1cm4gLUVOT01FTTsKCglkYXRhLT5kZXYgPSAmcGRldi0+ZGV2OwoJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGF0YSk7CgoJcmV0ID0gbHRjMjk1Ml9wb3dlcm9mZl9pbml0KHBkZXYpOwoJaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoKCS8qIFRPRE86IHJlbW92ZSBsdGMyOTUyX2RhdGEgKi8KCWx0YzI5NTJfZGF0YSA9IGRhdGE7CglwbV9wb3dlcl9vZmYgPSBsdGMyOTUyX3Bvd2Vyb2ZmX2tpbGw7CgoJZGF0YS0+cGFuaWNfbm90aWZpZXIubm90aWZpZXJfY2FsbCA9IGx0YzI5NTJfcG93ZXJvZmZfbm90aWZ5X3BhbmljOwoJYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LAoJCQkJICAgICAgICZkYXRhLT5wYW5pY19ub3RpZmllcik7CglkZXZfaW5mbygmcGRldi0+ZGV2LCAicHJvYmUgc3VjY2Vzc2Z1bFxuIik7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgbHRjMjk1Ml9wb3dlcm9mZl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKewoJc3RydWN0IGx0YzI5NTJfcG93ZXJvZmYgKmRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKCglwbV9wb3dlcl9vZmYgPSBOVUxMOwoJaHJ0aW1lcl9jYW5jZWwoJmRhdGEtPnRpbWVyX3RyaWdnZXIpOwoJaHJ0aW1lcl9jYW5jZWwoJmRhdGEtPnRpbWVyX3dkZSk7CglhdG9taWNfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwKCQkJCQkgJmRhdGEtPnBhbmljX25vdGlmaWVyKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9sdGMyOTUyX3Bvd2Vyb2ZmX21hdGNoW10gPSB7Cgl7IC5jb21wYXRpYmxlID0gImxsdGMsbHRjMjk1MiJ9LAoJe30sCn07Ck1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG9mX2x0YzI5NTJfcG93ZXJvZmZfbWF0Y2gpOwoKc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbHRjMjk1Ml9wb3dlcm9mZl9kcml2ZXIgPSB7CgkucHJvYmUgPSBsdGMyOTUyX3Bvd2Vyb2ZmX3Byb2JlLAoJLnJlbW92ZSA9IGx0YzI5NTJfcG93ZXJvZmZfcmVtb3ZlLAoJLmRyaXZlciA9IHsKCQkubmFtZSA9ICJsdGMyOTUyLXBvd2Vyb2ZmIiwKCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9sdGMyOTUyX3Bvd2Vyb2ZmX21hdGNoLAoJfSwKfTsKCm1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobHRjMjk1Ml9wb3dlcm9mZl9kcml2ZXIpOwoKTU9EVUxFX0FVVEhPUigiUmVu6SBNb2xsIDxyZW5lLm1vbGxAeHNlbnMuY29tPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIkxUQyBQb3dlclBhdGggcG93ZXItb2ZmIGRyaXZlciIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cg==