LyoKICogTFRDMjk1MiAoUG93ZXJQYXRoKSBkcml2ZXIKICoKICogQ29weXJpZ2h0IChDKSAyMDE0LCBYc2VucyBUZWNobm9sb2dpZXMgQlYgPGluZm9AeHNlbnMuY29tPgogKiBNYWludGFpbmVyOiBSZW7pIE1vbGwgPGxpbnV4QHItbW9sbC5ubD4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAtIERlc2NyaXB0aW9uCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogVGhpcyBkcml2ZXIgaXMgdG8gYmUgdXNlZCB3aXRoIGFuIGV4dGVybmFsIFBvd2VyUGF0aCBDb250cm9sbGVyIChMVEMyOTUyKS4KICogSXRzIGZ1bmN0aW9uIGlzIHRvIGRldGVybWluZSB3aGVuIGEgZXh0ZXJuYWwgc2h1dCBkb3duIGlzIHRyaWdnZXJlZAogKiBhbmQgcmVhY3QgYnkgcHJvcGVybHkgc2h1dHRpbmcgZG93biB0aGUgc3lzdGVtLgogKgogKiBUaGlzIGRyaXZlciBleHBlY3RzIGEgZGV2aWNlIHRyZWUgd2l0aCBhIGx0YzI5NTIgZW50cnkgZm9yIHBpbiBtYXBwaW5nLgogKgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIC0gR1BJTwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIFRoZSBmb2xsb3dpbmcgR1BJT3MgYXJlIHVzZWQ6CiAqIC0gdHJpZ2dlciAoaW5wdXQpCiAqICAgICBBIGxldmVsIGNoYW5nZSBpbmRpY2F0ZXMgdGhlIHNodXQtZG93biB0cmlnZ2VyLiBJZiBpdCdzIHN0YXRlIHJldmVydHMKICogICAgIHdpdGhpbiB0aGUgdGltZS1vdXQgZGVmaW5lZCBieSB0cmlnZ2VyX2RlbGF5LCB0aGUgc2h1dCBkb3duIGlzIG5vdAogKiAgICAgZXhlY3V0ZWQuCiAqCiAqIC0gd2F0Y2hkb2cgKG91dHB1dCkKICogICAgIE9uY2UgYSBzaHV0IGRvd24gaXMgdHJpZ2dlcmVkLCB0aGUgZHJpdmVyIHdpbGwgdG9nZ2xlIHRoaXMgc2lnbmFsLAogKiAgICAgd2l0aCBhbiBpbnRlcm5hbCAod2RlX2ludGVydmFsKSB0byBzdGFsbCB0aGUgaGFyZHdhcmUgc2h1dCBkb3duLgogKgogKiAtIGtpbGwgKG91dHB1dCkKICogICAgIFRoZSBsYXN0IGFjdGlvbiBkdXJpbmcgc2h1dCBkb3duIGlzIHRyaWdnZXJpbmcgdGhpcyBzaWduYWxsaW5nLCBzdWNoCiAqICAgICB0aGF0IHRoZSBQb3dlclBhdGggQ29udHJvbCB3aWxsIHBvd2VyIGRvd24gdGhlIGhhcmR3YXJlLgogKgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIC0gSW50ZXJydXB0cwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIFRoZSBkcml2ZXIgcmVxdWlyZXMgYSBub24tc2hhcmVkLCBlZGdlLXRyaWdnZXJlZCBpbnRlcnJ1cHQgb24gdGhlIHRyaWdnZXIKICogR1BJTy4KICoKICovCgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgojaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgva21vZC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+CiNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KCnN0cnVjdCBsdGMyOTUyX3Bvd2Vyb2ZmX2RhdGEgewoJc3RydWN0IGhydGltZXIgdGltZXJfdHJpZ2dlcjsKCXN0cnVjdCBocnRpbWVyIHRpbWVyX3dkZTsKCglrdGltZV90IHRyaWdnZXJfZGVsYXk7CglrdGltZV90IHdkZV9pbnRlcnZhbDsKCglzdHJ1Y3QgZGV2aWNlICpkZXY7CgoJLyoqCgkgKiAwOiB0cmlnZ2VyCgkgKiAxOiB3YXRjaGRvZwoJICogMjoga2lsbAoJICovCglzdHJ1Y3QgZ3Bpb19kZXNjICpncGlvWzNdOwp9OwoKc3RhdGljIGludCBsdGMyOTUyX3Bvd2Vyb2ZmX3BhbmljOwpzdGF0aWMgc3RydWN0IGx0YzI5NTJfcG93ZXJvZmZfZGF0YSAqbHRjMjk1Ml9kYXRhOwoKI2RlZmluZSBQT1dFUlBBVEhfSU9fVFJJR0dFUgkwCiNkZWZpbmUgUE9XRVJQQVRIX0lPX1dBVENIRE9HCTEKI2RlZmluZSBQT1dFUlBBVEhfSU9fS0lMTAkyCgovKioKICogbHRjMjk1Ml9wb3dlcm9mZl90aW1lcl93ZGUgLSBUaW1lciBjYWxsYmFjawogKiBUb2dnbGVzIHRoZSB3YXRjaGRvZyByZXNldCBzaWduYWwgZWFjaCB3ZGVfaW50ZXJ2YWwKICoKICogQHRpbWVyOiBjb3JyZXNwb25kaW5nIHRpbWVyCiAqCiAqIFJldHVybnMgSFJUSU1FUl9SRVNUQVJUIGZvciBhbiBpbmZpbml0ZSBsb29wIHdoaWNoIHdpbGwgb25seSBzdG9wIHdoZW4gdGhlCiAqIG1hY2hpbmUgYWN0dWFsbHkgc2h1dHMgZG93bgogKi8Kc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGx0YzI5NTJfcG93ZXJvZmZfdGltZXJfd2RlKHN0cnVjdCBocnRpbWVyICp0aW1lcikKewoJa3RpbWVfdCBub3c7CglpbnQgc3RhdGU7Cgl1bnNpZ25lZCBsb25nIG92ZXJydW5zOwoKCWlmIChsdGMyOTUyX3Bvd2Vyb2ZmX3BhbmljKQoJCXJldHVybiBIUlRJTUVSX05PUkVTVEFSVDsKCglzdGF0ZSA9IGdwaW9kX2dldF92YWx1ZShsdGMyOTUyX2RhdGEtPmdwaW9bUE9XRVJQQVRIX0lPX1dBVENIRE9HXSk7CglncGlvZF9zZXRfdmFsdWUobHRjMjk1Ml9kYXRhLT5ncGlvW1BPV0VSUEFUSF9JT19XQVRDSERPR10sICFzdGF0ZSk7CgoJbm93ID0gaHJ0aW1lcl9jYl9nZXRfdGltZSh0aW1lcik7CglvdmVycnVucyA9IGhydGltZXJfZm9yd2FyZCh0aW1lciwgbm93LCBsdGMyOTUyX2RhdGEtPndkZV9pbnRlcnZhbCk7CgoJcmV0dXJuIEhSVElNRVJfUkVTVEFSVDsKfQoKc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGx0YzI5NTJfcG93ZXJvZmZfdGltZXJfdHJpZ2dlcigKCXN0cnVjdCBocnRpbWVyICp0aW1lcikKewoJaW50IHJldDsKCglyZXQgPSBocnRpbWVyX3N0YXJ0KCZsdGMyOTUyX2RhdGEtPnRpbWVyX3dkZSwKCQlsdGMyOTUyX2RhdGEtPndkZV9pbnRlcnZhbCwgSFJUSU1FUl9NT0RFX1JFTCk7CgoJaWYgKHJldCkgewoJCWRldl9lcnIobHRjMjk1Ml9kYXRhLT5kZXYsICJ1bmFibGUgdG8gc3RhcnQgdGhlIHRpbWVyXG4iKTsKCQkvKgoJCSAqIFRoZSBkZXZpY2Ugd2lsbCBub3QgdG9nZ2xlIHRoZSB3YXRjaGRvZyByZXNldCwKCQkgKiB0aHVzIHNodXQgZG93biBpcyBvbmx5IHNhZmUgaWYgdGhlIFBvd2VyUGF0aCBjb250cm9sbGVyCgkJICogaGFzIGEgbG9uZyBlbm91Z2ggdGltZS1vZmYgYmVmb3JlIHRyaWdnZXJpbmcgYSBoYXJkd2FyZQoJCSAqIHBvd2VyLW9mZi4KCQkgKgoJCSAqIE9ubHkgc2VuZGluZyBhIHdhcm5pbmcgYXMgdGhlIHN5c3RlbSB3aWxsIHBvd2VyLW9mZiBhbnl3YXkKCQkgKi8KCX0KCglkZXZfaW5mbyhsdGMyOTUyX2RhdGEtPmRldiwgImV4ZWN1dGluZyBzaHV0ZG93blxuIik7CgoJb3JkZXJseV9wb3dlcm9mZih0cnVlKTsKCglyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Cn0KCi8qKgogKiBsdGMyOTUyX3Bvd2Vyb2ZmX2hhbmRsZXIgLSBJbnRlcnJ1cHQgaGFuZGxlcgogKiBUcmlnZ2VyZWQgZWFjaCB0aW1lIHRoZSB0cmlnZ2VyIHNpZ25hbCBjaGFuZ2VzIHN0YXRlIGFuZCAoZGUpYWN0aXZhdGVzIGEKICogdGltZS1vdXQgKHRpbWVyX3RyaWdnZXIpLiBPbmNlIHRoZSB0aW1lLW91dCBpcyBhY3R1YWxseSByZWFjaGVkIHRoZSBzaHV0CiAqIGRvd24gaXMgZXhlY3V0ZWQuCiAqCiAqIEBpcnE6IElSUSBudW1iZXIKICogQGRldl9pZDogcG9pbnRlciB0byB0aGUgbWFpbiBkYXRhIHN0cnVjdHVyZQogKi8Kc3RhdGljIGlycXJldHVybl90IGx0YzI5NTJfcG93ZXJvZmZfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCnsKCWludCByZXQ7CglzdHJ1Y3QgbHRjMjk1Ml9wb3dlcm9mZl9kYXRhICpkYXRhID0gZGV2X2lkOwoKCWlmIChsdGMyOTUyX3Bvd2Vyb2ZmX3BhbmljKQoJCWdvdG8gaXJxX29rOwoKCWlmIChocnRpbWVyX2FjdGl2ZSgmZGF0YS0+dGltZXJfd2RlKSkgewoJCS8qIHNodXRkb3duIGlzIGFscmVhZHkgdHJpZ2dlcmVkLCBub3RoaW5nIHRvIGRvIGFueSBtb3JlICovCgkJZ290byBpcnFfb2s7Cgl9CgoJaWYgKCFocnRpbWVyX2FjdGl2ZSgmZGF0YS0+dGltZXJfdHJpZ2dlcikpIHsKCQlyZXQgPSBocnRpbWVyX3N0YXJ0KCZkYXRhLT50aW1lcl90cmlnZ2VyLCBkYXRhLT50cmlnZ2VyX2RlbGF5LAoJCQlIUlRJTUVSX01PREVfUkVMKTsKCgkJaWYgKHJldCkKCQkJZGV2X2VycihkYXRhLT5kZXYsICJ1bmFibGUgdG8gc3RhcnQgdGhlIHdhaXQgdGltZXJcbiIpOwoJfSBlbHNlIHsKCQlyZXQgPSBocnRpbWVyX2NhbmNlbCgmZGF0YS0+dGltZXJfdHJpZ2dlcik7CgkJLyogb21pdHRpbmcgcmV0dXJuIHZhbHVlIGNoZWNrLCB0aW1lciBzaG91bGQgaGF2ZSBiZWVuIHZhbGlkICovCgl9CgppcnFfb2s6CglyZXR1cm4gSVJRX0hBTkRMRUQ7Cn0KCnN0YXRpYyB2b2lkIGx0YzI5NTJfcG93ZXJvZmZfa2lsbCh2b2lkKQp7CglncGlvZF9zZXRfdmFsdWUobHRjMjk1Ml9kYXRhLT5ncGlvW1BPV0VSUEFUSF9JT19LSUxMXSwgMSk7Cn0KCnN0YXRpYyBpbnQgbHRjMjk1Ml9wb3dlcm9mZl9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCglwbV9tZXNzYWdlX3Qgc3RhdGUpCnsKCXJldHVybiAtRU5PU1lTOwp9CgpzdGF0aWMgaW50IGx0YzI5NTJfcG93ZXJvZmZfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCnsKCXJldHVybiAtRU5PU1lTOwp9CgpzdGF0aWMgdm9pZCBsdGMyOTUyX3Bvd2Vyb2ZmX2RlZmF1bHQoc3RydWN0IGx0YzI5NTJfcG93ZXJvZmZfZGF0YSAqZGF0YSkKewoJdW5zaWduZWQgaW50IGk7CgoJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGF0YS0+Z3Bpbyk7IGkrKykKCQlkYXRhLT5ncGlvW2ldID0gTlVMTDsKCglkYXRhLT53ZGVfaW50ZXJ2YWwgPSBrdGltZV9zZXQoMCwgMzAwTCoxRTZMKTsKCWRhdGEtPnRyaWdnZXJfZGVsYXkgPSBrdGltZV9zZXQoMiwgNTAwTCoxRTZMKTsKCglocnRpbWVyX2luaXQoJmRhdGEtPnRpbWVyX3RyaWdnZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CglkYXRhLT50aW1lcl90cmlnZ2VyLmZ1bmN0aW9uID0gJmx0YzI5NTJfcG93ZXJvZmZfdGltZXJfdHJpZ2dlcjsKCglocnRpbWVyX2luaXQoJmRhdGEtPnRpbWVyX3dkZSwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKCWRhdGEtPnRpbWVyX3dkZS5mdW5jdGlvbiA9ICZsdGMyOTUyX3Bvd2Vyb2ZmX3RpbWVyX3dkZTsKfQoKc3RhdGljIGludCBsdGMyOTUyX3Bvd2Vyb2ZmX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKewoJaW50IHJldCwgdmlycTsKCXVuc2lnbmVkIGludCBpOwoJc3RydWN0IGx0YzI5NTJfcG93ZXJvZmZfZGF0YSAqZGF0YTsKCglzdGF0aWMgY2hhciAqbmFtZVtdID0gewoJCSJ0cmlnZ2VyIiwKCQkid2F0Y2hkb2ciLAoJCSJraWxsIiwKCQlOVUxMCgl9OwoKCWRhdGEgPSBsdGMyOTUyX2RhdGE7CglsdGMyOTUyX3Bvd2Vyb2ZmX2RlZmF1bHQobHRjMjk1Ml9kYXRhKTsKCglmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsdGMyOTUyX2RhdGEtPmdwaW8pOyBpKyspIHsKCQlsdGMyOTUyX2RhdGEtPmdwaW9baV0gPSBncGlvZF9nZXQoJnBkZXYtPmRldiwgbmFtZVtpXSk7CgoJCWlmIChJU19FUlIobHRjMjk1Ml9kYXRhLT5ncGlvW2ldKSkgewoJCQlyZXQgPSBQVFJfRVJSKGx0YzI5NTJfZGF0YS0+Z3Bpb1tpXSk7CgkJCWRldl9lcnIoJnBkZXYtPmRldiwKCQkJCSJ1bmFibGUgdG8gY2xhaW0gdGhlIGZvbGxvd2luZyBncGlvOiAlc1xuIiwKCQkJCW5hbWVbaV0pOwoJCQlnb3RvIGVycl9pbzsKCQl9Cgl9CgoJcmV0ID0gZ3Bpb2RfZGlyZWN0aW9uX291dHB1dCgKCQlsdGMyOTUyX2RhdGEtPmdwaW9bUE9XRVJQQVRIX0lPX1dBVENIRE9HXSwgMCk7CglpZiAocmV0KSB7CgkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIHVzZSB3YXRjaGRvZy1ncGlvIGFzIG91dHB1dFxuIik7CgkJZ290byBlcnJfaW87Cgl9CgoJcmV0ID0gZ3Bpb2RfZGlyZWN0aW9uX291dHB1dChsdGMyOTUyX2RhdGEtPmdwaW9bUE9XRVJQQVRIX0lPX0tJTExdLCAwKTsKCWlmIChyZXQpIHsKCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gdXNlIGtpbGwtZ3BpbyBhcyBvdXRwdXRcbiIpOwoJCWdvdG8gZXJyX2lvOwoJfQoKCXZpcnEgPSBncGlvZF90b19pcnEobHRjMjk1Ml9kYXRhLT5ncGlvW1BPV0VSUEFUSF9JT19UUklHR0VSXSk7CglpZiAodmlycSA8IDApIHsKCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgbWFwIEdQSU8gYXMgaW50ZXJydXB0Iik7CgkJZ290byBlcnJfaW87Cgl9CgoJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCB2aXJxLAoJCQkgICAgICAgbHRjMjk1Ml9wb3dlcm9mZl9oYW5kbGVyLAoJCQkgICAgICAgKElSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9UUklHR0VSX1JJU0lORyksCgkJCSAgICAgICAibHRjMjk1Mi1wb3dlcm9mZiIsCgkJCSAgICAgICBsdGMyOTUyX2RhdGEpOwoKCWlmIChyZXQpIHsKCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgY29uZmlndXJlIGFuIGludGVycnVwdCBoYW5kbGVyXG4iKTsKCQlnb3RvIGVycl9pbzsKCX0KCglyZXR1cm4gMDsKCmVycl9pbzoKCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGx0YzI5NTJfZGF0YS0+Z3Bpbyk7IGkrKykKCQlpZiAobHRjMjk1Ml9kYXRhLT5ncGlvW2ldKQoJCQlncGlvZF9wdXQobHRjMjk1Ml9kYXRhLT5ncGlvW2ldKTsKCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IGx0YzI5NTJfcG93ZXJvZmZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKewoJaW50IHJldDsKCglpZiAocG1fcG93ZXJfb2ZmKSB7CgkJZGV2X2VycigmcGRldi0+ZGV2LCAicG1fcG93ZXJfb2ZmIGFscmVhZHkgcmVnaXN0ZXJlZCIpOwoJCXJldHVybiAtRUJVU1k7Cgl9CgoJbHRjMjk1Ml9kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqbHRjMjk1Ml9kYXRhKSwKCQkJCSAgICBHRlBfS0VSTkVMKTsKCWlmICghbHRjMjk1Ml9kYXRhKQoJCXJldHVybiAtRU5PTUVNOwoKCWx0YzI5NTJfZGF0YS0+ZGV2ID0gJnBkZXYtPmRldjsKCglyZXQgPSBsdGMyOTUyX3Bvd2Vyb2ZmX2luaXQocGRldik7CglpZiAocmV0KQoJCXJldHVybiByZXQ7CgoJcG1fcG93ZXJfb2ZmID0gJmx0YzI5NTJfcG93ZXJvZmZfa2lsbDsKCglkZXZfaW5mbygmcGRldi0+ZGV2LCAicHJvYmUgc3VjY2Vzc2Z1bFxuIik7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgbHRjMjk1Ml9wb3dlcm9mZl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKewoJdW5zaWduZWQgaW50IGk7CgoJcG1fcG93ZXJfb2ZmID0gTlVMTDsKCglpZiAobHRjMjk1Ml9kYXRhKQoJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGx0YzI5NTJfZGF0YS0+Z3Bpbyk7IGkrKykKCQkJZ3Bpb2RfcHV0KGx0YzI5NTJfZGF0YS0+Z3Bpb1tpXSk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX2x0YzI5NTJfcG93ZXJvZmZfbWF0Y2hbXSA9IHsKCXsgLmNvbXBhdGlibGUgPSAibGx0YyxsdGMyOTUyIn0sCgl7fSwKfTsKTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb2ZfbHRjMjk1Ml9wb3dlcm9mZl9tYXRjaCk7CgpzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBsdGMyOTUyX3Bvd2Vyb2ZmX2RyaXZlciA9IHsKCS5wcm9iZSA9IGx0YzI5NTJfcG93ZXJvZmZfcHJvYmUsCgkucmVtb3ZlID0gbHRjMjk1Ml9wb3dlcm9mZl9yZW1vdmUsCgkuZHJpdmVyID0gewoJCS5uYW1lID0gImx0YzI5NTItcG93ZXJvZmYiLAoJCS5vZl9tYXRjaF90YWJsZSA9IG9mX2x0YzI5NTJfcG93ZXJvZmZfbWF0Y2gsCgl9LAoJLnN1c3BlbmQgPSBsdGMyOTUyX3Bvd2Vyb2ZmX3N1c3BlbmQsCgkucmVzdW1lID0gbHRjMjk1Ml9wb3dlcm9mZl9yZXN1bWUsCn07CgpzdGF0aWMgaW50IGx0YzI5NTJfcG93ZXJvZmZfbm90aWZ5X3BhbmljKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCgl1bnNpZ25lZCBsb25nIGNvZGUsIHZvaWQgKnVudXNlZCkKewoJbHRjMjk1Ml9wb3dlcm9mZl9wYW5pYyA9IDE7CglyZXR1cm4gTk9USUZZX0RPTkU7Cn0KCnN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbHRjMjk1Ml9wb3dlcm9mZl9wYW5pY19uYiA9IHsKCS5ub3RpZmllcl9jYWxsID0gbHRjMjk1Ml9wb3dlcm9mZl9ub3RpZnlfcGFuaWMsCn07CgpzdGF0aWMgaW50IF9faW5pdCBsdGMyOTUyX3Bvd2Vyb2ZmX3BsYXRmb3JtX2luaXQodm9pZCkKewoJbHRjMjk1Ml9wb3dlcm9mZl9wYW5pYyA9IDA7CgoJYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LAoJCSZsdGMyOTUyX3Bvd2Vyb2ZmX3BhbmljX25iKTsKCglyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZsdGMyOTUyX3Bvd2Vyb2ZmX2RyaXZlcik7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBsdGMyOTUyX3Bvd2Vyb2ZmX3BsYXRmb3JtX2V4aXQodm9pZCkKewoJYXRvbWljX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsCgkJJmx0YzI5NTJfcG93ZXJvZmZfcGFuaWNfbmIpOwoKCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZsdGMyOTUyX3Bvd2Vyb2ZmX2RyaXZlcik7Cn0KCm1vZHVsZV9pbml0KGx0YzI5NTJfcG93ZXJvZmZfcGxhdGZvcm1faW5pdCk7Cm1vZHVsZV9leGl0KGx0YzI5NTJfcG93ZXJvZmZfcGxhdGZvcm1fZXhpdCk7CgpNT0RVTEVfQVVUSE9SKCJSZW7pIE1vbGwgPHJlbmUubW9sbEB4c2Vucy5jb20+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiTFRDIFBvd2VyUGF0aCBwb3dlci1vZmYgZHJpdmVyIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsK