LyoKICogQ29weXJpZ2h0IChDKSAyMDA5IEp1ZXJnZW4gQmVpc2VydCwgUGVuZ3V0cm9uaXgKICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICoKICovCgovKioKICogQGZpbGUKICogQGJyaWVmIGE5bTI0MTAgU3BlY2lmaWMgQm9hcmQgSW5pdGlhbGl6YXRpb24gcm91dGluZXMKICoKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxkcml2ZXIuaD4KI2luY2x1ZGUgPGluaXQuaD4KI2luY2x1ZGUgPGFzbS9hcm1saW51eC5oPgojaW5jbHVkZSA8Z2VuZXJhdGVkL21hY2gtdHlwZXMuaD4KI2luY2x1ZGUgPHBhcnRpdGlvbi5oPgojaW5jbHVkZSA8bmFuZC5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxtYWNoL3MzYzI0eDAtaW9tYXAuaD4KI2luY2x1ZGUgPG1hY2gvczNjMjR4MC1uYW5kLmg+CgpzdGF0aWMgc3RydWN0IG1lbW9yeV9wbGF0Zm9ybV9kYXRhIHJhbV9wZGF0YSA9IHsKCS5uYW1lCQk9ICJyYW0wIiwKCS5mbGFncwkJPSBERVZGU19SRFdSLAp9OwoKc3RhdGljIHN0cnVjdCBkZXZpY2VfZCBzZHJhbV9kZXYgPSB7CgkuaWQJCT0gLTEsCgkubmFtZSAgICAgCT0gInJhbSIsCgkubWFwX2Jhc2UJPSBDUzZfQkFTRSwKCS5wbGF0Zm9ybV9kYXRhICA9ICZyYW1fcGRhdGEsCn07CgovLyB7Ik5BTkQgMU1pQiAzLDNWIDgtYml0IiwgMHhlYywgMjU2LCAxLCAweDEwMDAsIDB9LApzdGF0aWMgc3RydWN0IHMzYzI0eDBfbmFuZF9wbGF0Zm9ybV9kYXRhIG5hbmRfaW5mbyA9IHsKCS5uYW5kX3RpbWluZyA9IENBTENfTkZDT05GX1RJTUlORyhBOU0yNDEwX1RBQ0xTLCBBOU0yNDEwX1RXUlBIMCwgQTlNMjQxMF9UV1JQSDEpCn07CgpzdGF0aWMgc3RydWN0IGRldmljZV9kIG5hbmRfZGV2ID0gewoJLmlkCSAgPSAtMSwKCS5uYW1lICAgICA9ICJzM2MyNHgwX25hbmQiLAoJLm1hcF9iYXNlID0gUzNDMjRYMF9OQU5EX0JBU0UsCgkucGxhdGZvcm1fZGF0YQk9ICZuYW5kX2luZm8sCn07CgovKgogKiBTTVNDIDkxQzExMSBuZXR3b3JrIGNvbnRyb2xsZXIgb24gdGhlIGJhc2Vib2FyZAogKiBjb25uZWN0ZWQgdG8gQ1MgbGluZSAxIGFuZCBpbnRlcnJ1cHQgbGluZQogKiBHUElPMywgZGF0YSB3aWR0aCBpcyAzMiBiaXQKICovCnN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2QgbmV0d29ya19kZXYgPSB7CgkuaWQgICAgICAgPSAtMSwKICAgICAgICAubmFtZSAgICAgPSAic21jOTFjMTExIiwKICAgICAgICAubWFwX2Jhc2UgPSBDUzFfQkFTRSArIDB4MzAwLAogICAgICAgIC5zaXplICAgICA9IDE2LAp9OwoKc3RhdGljIGludCBhOW0yNDEwX2RldmljZXNfaW5pdCh2b2lkKQp7Cgl1aW50MzJfdCByZWc7CgoJLyoKCSAqIGRldGVjdCB0aGUgY3VycmVudCBtZW1vcnkgc2l6ZQoJICogTm90ZTogT24gdGhpcyBjYXJkIHRoZSBzZWNvbmQgU0RSQU0gcGFnZSBpcyBub3QgdXNlZAoJICovCglyZWcgPSByZWFkbChCQU5LU0laRSk7CgoJc3dpdGNoIChyZWcgJj0gMHg3KSB7CgljYXNlIDA6CgkJc2RyYW1fZGV2LnNpemUgPSAzMiAqIDEwMjQgKiAxMDI0OwoJCWJyZWFrOwoJY2FzZSAxOgoJCXNkcmFtX2Rldi5zaXplID0gNjQgKiAxMDI0ICogMTAyNDsKCQlicmVhazsKCWNhc2UgMjoKCQlzZHJhbV9kZXYuc2l6ZSA9IDEyOCAqIDEwMjQgKiAxMDI0OwoJCWJyZWFrOwoJY2FzZSA0OgoJCXNkcmFtX2Rldi5zaXplID0gMiAqIDEwMjQgKiAxMDI0OwoJCWJyZWFrOwoJY2FzZSA1OgoJCXNkcmFtX2Rldi5zaXplID0gNCAqIDEwMjQgKiAxMDI0OwoJCWJyZWFrOwoJY2FzZSA2OgoJCXNkcmFtX2Rldi5zaXplID0gOCAqIDEwMjQgKiAxMDI0OwoJCWJyZWFrOwoJY2FzZSA3OgoJCXNkcmFtX2Rldi5zaXplID0gMTYgKiAxMDI0ICogMTAyNDsKCQlicmVhazsKCX0KCgkvKiAtLS0tLS0tLS0tIGNvbmZpZ3VyZSB0aGUgR1BJT3MgLS0tLS0tLS0tLS0tLSAqLwoJd3JpdGVsKDB4MDA3RkZGRkYsIEdQQUNPTik7Cgl3cml0ZWwoMHgwMDAwMDAwMCwgR1BDQ09OKTsKCXdyaXRlbCgweDAwMDAwMDAwLCBHUENVUCk7Cgl3cml0ZWwoMHgwMDAwMDAwMCwgR1BEQ09OKTsKCXdyaXRlbCgweDAwMDAwMDAwLCBHUERVUCk7Cgl3cml0ZWwoMHhBQUFBQUFBQSwgR1BFQ09OKTsKCXdyaXRlbCgweDAwMDBFMDNGLCBHUEVVUCk7Cgl3cml0ZWwoMHgwMDAwMDAwMCwgR1BCQ09OKTsJLyogYWxsIGlucHV0cyAqLwoJd3JpdGVsKDB4MDAwMDAwMDcsIEdQQlVQKTsJLyogcHVsbHVwIGRpc2FibGVkIGZvciBHUEIwLi4zICovCgl3cml0ZWwoMHgwMDAwOTAwMCwgR1BGQ09OKTsJLyogR1BGNyBDTEtfSU5UIywgR1BGNiBEZWJ1Zy1MRUQgKi8KCXdyaXRlbCgweDAwMDAwMEZGLCBHUEZVUCk7Cgl3cml0ZWwocmVhZGwoR1BHREFUKSB8IDB4MDAxMCwgR1BHREFUKTsJLyogc3dpdGNoIG9mZiBMQ0QgYmFja2xpZ2h0ICovCgl3cml0ZWwoMHhGRjAwQTkzOCwgR1BHQ09OKTsJLyogc3dpdGNoIG9mZiBVU0IgZGV2aWNlICovCgl3cml0ZWwoMHgwMDAwRjAwMCwgR1BHVVApOwoJd3JpdGVsKHJlYWRsKEdQSERBVCkgfCAweDEwMCwgR1BIREFUKTsJLyogc3dpdGNoIEJPT1RJTlQvR1BJT19PTiMgdG8gaGlnaCAqLwoJd3JpdGVsKDB4MDAwMDA3RkYsIEdQSFVQKTsKCXdyaXRlbCgweDAwMjlGQUFBLCBHUEhDT04pOwoJLyoKCSAqIFVTQiBwb3J0MSBub3JtYWwsIFVTQiBwb3J0MCBub3JtYWwsIFVTQjEgcGFkcyBmb3IgZGV2aWNlCgkgKiBQQ0xLIG91dHB1dCBvbiBDTEtPVVQwLCBVUExMIENMSyBvdXRwdXQgb24gQ0xLT1VUMSwKCSAqIDJuZCBTRFJBTSBiYW5rIG9mZiAob25seSBiYW5rIDEgaXMgdXNlZCkKCSAqLwoJd3JpdGVsKDB4NDAxNDAsIE1JU0NDUik7CgoJLyogLS0tLS0tLS0tLS0gY29uZmlndXJlIHRoZSBhY2Nlc3MgdG8gdGhlIG91dGVyIHNwYWNlIC0tLS0tLS0tLS0gKi8KCXJlZyA9IHJlYWRsKEJXU0NPTik7CgoJLyogQ1MjMSB0byBhY2Nlc3MgdGhlIG5ldHdvcmsgY29udHJvbGxlciAqLwoJcmVnICY9IH4weGYwOwoJcmVnIHw9IDB4ZTA7Cgl3cml0ZWwoMHgxMzUwLCBCQU5LQ09OMSk7CgoJLyogQ1MjMiB0byB0aGUgZHVhbCAxNjU1MCBVQVJUICovCglyZWcgJj0gfjB4ZjAwOwoJcmVnIHw9IDB4NDAwOwoJd3JpdGVsKDB4MGQ1MCwgQkFOS0NPTjIpOwoKCXdyaXRlbChyZWcsIEJXU0NPTik7CgoJLyogcmVsZWFzZSB0aGUgcmVzZXQgc2lnbmFsIHRvIHRoZSBuZXR3b3JrIGFuZCBVQVJUIGRldmljZSAqLwogICAgICAgIHJlZyA9IHJlYWRsKE1JU0NDUik7CglyZWcgfD0gMHgxMDAwMDsKCXdyaXRlbChyZWcsIE1JU0NDUik7CgoJLyogLS0tLS0tLS0tLS0gdGhlIGRldmljZXMgdGhlIGJvb3QgbG9hZGVyIHNob3VsZCB3b3JrIHdpdGggLS0tLS0tLS0gKi8KCXJlZ2lzdGVyX2RldmljZSgmbmFuZF9kZXYpOwoJcmVnaXN0ZXJfZGV2aWNlKCZzZHJhbV9kZXYpOwoJcmVnaXN0ZXJfZGV2aWNlKCZuZXR3b3JrX2Rldik7CgojaWZkZWYgQ09ORklHX05BTkQKCS8qIC0tLS0tLS0tLS0tIGFkZCBzb21lIHZpdGFsIHBhcnRpdGlvbnMgLS0tLS0tLS0gKi8KCWRldmZzX2FkZF9wYXJ0aXRpb24oIm5hbmQwIiwgMHgwMDAwMCwgMHg0MDAwMCwgUEFSVElUSU9OX0ZJWEVELCAic2VsZl9yYXciKTsKCWRldl9hZGRfYmJfZGV2KCJzZWxmX3JhdyIsICJzZWxmMCIpOwoKCWRldmZzX2FkZF9wYXJ0aXRpb24oIm5hbmQwIiwgMHg0MDAwMCwgMHgyMDAwMCwgUEFSVElUSU9OX0ZJWEVELCAiZW52X3JhdyIpOwoJZGV2X2FkZF9iYl9kZXYoImVudl9yYXciLCAiZW52MCIpOwojZW5kaWYKCglhcm1saW51eF9hZGRfZHJhbSgmc2RyYW1fZGV2KTsKCWFybWxpbnV4X3NldF9ib290cGFyYW1zKCh2b2lkICopc2RyYW1fZGV2Lm1hcF9iYXNlICsgMHgxMDApOwoJYXJtbGludXhfc2V0X2FyY2hpdGVjdHVyZShNQUNIX1RZUEVfQTlNMjQxMCk7CgoJcmV0dXJuIDA7Cn0KCmRldmljZV9pbml0Y2FsbChhOW0yNDEwX2RldmljZXNfaW5pdCk7CgojaWZkZWYgQ09ORklHX1MzQzI0WFhfTkFORF9CT09UCnZvaWQgX19iYXJlX2luaXQgbmFuZF9ib290KHZvaWQpCnsKCXMzYzI0eDBfbmFuZF9sb2FkX2ltYWdlKCh2b2lkICopVEVYVF9CQVNFLCAyNTYgKiAxMDI0LCAwKTsKfQojZW5kaWYKCnN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2QgYTltMjQxMF9zZXJpYWxfZGV2aWNlID0gewoJLmlkICAgICAgID0gLTEsCgkubmFtZSAgICAgPSAiczNjMjR4MF9zZXJpYWwiLAoJLm1hcF9iYXNlID0gVUFSVDFfQkFTRSwKCS5zaXplICAgICA9IFVBUlQxX1NJWkUsCn07CgpzdGF0aWMgaW50IGE5bTI0MTBfY29uc29sZV9pbml0KHZvaWQpCnsKCXJlZ2lzdGVyX2RldmljZSgmYTltMjQxMF9zZXJpYWxfZGV2aWNlKTsKCXJldHVybiAwOwp9Cgpjb25zb2xlX2luaXRjYWxsKGE5bTI0MTBfY29uc29sZV9pbml0KTsKCi8qKiBAcGFnZSBhOW0yNDEwIERJR0kncyBhOW0yNDEwCgpUaGlzIENQVSBjYXJkIGlzIGJhc2VkIG9uIGEgU2Ftc3VuZyBTM0MyNDEwIENQVS4gVGhlIGNhcmQgaXMgc2hpcHBlZCB3aXRoOgoKLSBTM0MyNDEwXEAyMDAgTUh6IChBUk05MjBUL0FSTXY0VCkKLSAxMk1IeiBjcnlzdGFsIHJlZmVyZW5jZQotIFNEUkFNIDMyIE1pQgogICAtIFNhbXN1bmcgSzRNNTYzMjMzRS1FRTFICiAgIC0gMk0geCAzMkJpdCB4IDQgQmFua3MgTW9iaWxlIFNEUkFNCiAgIC0gOTAgcGluIEZCR0EKICAgLSBDTDNcQDEzM01IeiwgQ0wyXEAxMDBNSHogKENBUy9SQVMgZGVsYXkgMTlucykKICAgLSBmb3VyIGJhbmtzCiAgIC0gMzIgYml0IGRhdGEgYml0cwogICAtIHJvdyBhZGRyZXNzIHNpemUgaXMgMTEKICAgLSBSb3cgY3ljbGUgdGltZTogNjlucwogICAtIGNvbGx1bW4gYWRkcmVzcyBzaXplIGlzIDkgYml0cwogICAtIEV4dGVuZGVkIHRlbXBlcmF0dXJlIHJhbmdlICgtMjWwQy4uLjg1sEMpCiAgIC0gNjRtcyByZWZyZXNoIHBlcmlvZCAoNGspCi0gTkFORCBGbGFzaCAzMiBNaUIKICAgLSBTYW1zdW5nIEtNMjlVMjU2VAogICAtIDMyTWlCIDMsM1YgOC1iaXQKICAgLSBJRDogMHhFQywgMHg3NSwgMHg/PywgMHhCRAogICAtIDMwbnMvNDBucy8yMG5zCi0gSTJDIGludGVyZmFjZSwgMTAwS0h6IGFuZCA0MDBLSHoKICAtIFJlYWwgVGltZSBDbG9jawogICAgLSBEYWxsYXMgRFMxMzM3CiAgICAtIGFkZHJlc3MgMHg2OAogIC0gRUVQUk9NCiAgICAtIFNUIE0yNExDNjQKICAgIC0gYWRkcmVzcyAweDUwCiAgICAtIDE2Yml0IGFkZHJlc3NpbmcKLSBMQ0QgaW50ZXJmYWNlCi0gVG91Y2ggU2NyZWVuIGludGVyZmFjZQotIENhbWVyYSBpbnRlcmZhY2UKLSBJMlMgaW50ZXJmYWNlCi0gQUM5NyBBdWRpby1DT0RFQyBpbnRlcmZhY2UKLSBTRCBjYXJkIGludGVyZmFjZQotIDMgc2VyaWFsIFJTMjMyIGludGVyZmFjZXMKLSBIb3N0IGFuZCBkZXZpY2UgVVNCIGludGVyZmFjZSwgVVNCMS4xIGNvbXBsaWFudAotIEV0aGVybmV0IGludGVyZmFjZQogIC0gMTBNYnBzLCBDaXJydXMgTG9naWMsIENTODkwMEEgKG9uIHRoZSBDUFUgY2FyZCkgb3IKICAtIDEwLzEwME1icHMsIFNNU0MgOTFDMTExIChvbiB0aGUgYmFzZWJvYXJkKQotIFNQSSBpbnRlcmZhY2UKLSBKVEFHIGludGVyZmFjZQoKSG93IHRvIGdldCB0aGUgYmluYXJ5IGltYWdlOgoKVXNpbmcgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbjoKCkBjb2RlCm1ha2UgQVJDSD1hcm0gYTltMjQxMF9kZWZjb25maWcKQGVuZGNvZGUKCkJ1aWxkIHRoZSBiaW5hcnkgaW1hZ2U6CgpAY29kZQptYWtlIEFSQ0g9YXJtIENST1NTX0NPTVBJTEU9YXJtdjRjb21waWxlcgpAZW5kY29kZQoKQG5vdGUgcmVwbGFjZSB0aGUgYXJtdjRjb21waWxlciB3aXRoIHlvdXIgQVJNIHY0IGNyb3NzIGNvbXBpbGVyLgoqLwo=