LyogCiAqIEVtYWdpYyBFTUkgMnw2IHVzYiBhdWRpbyBpbnRlcmZhY2UgZmlybXdhcmUgbG9hZGVyLgogKiBDb3B5cmlnaHQgKEMpIDIwMDIKICogCVRhcGlvIExheHN0cvZtICh0YXBpby5sYXhzdHJvbUBpcHRpbWUuZmkpCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCiAqIAogKiAkSWQ6IGVtaTYyLmMsdiAxLjE1IDIwMDIvMDQvMjMgMDY6MTM6NTkgdGFwaW8gRXhwICQKICovCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgoKI2RlZmluZSBNQVhfSU5URUxfSEVYX1JFQ09SRF9MRU5HVEggMTYKdHlwZWRlZiBzdHJ1Y3QgX0lOVEVMX0hFWF9SRUNPUkQKewoJX191MzIJbGVuZ3RoOwoJX191MzIJYWRkcmVzczsKCV9fdTMyCXR5cGU7CglfX3U4CWRhdGFbTUFYX0lOVEVMX0hFWF9SRUNPUkRfTEVOR1RIXTsKfSBJTlRFTF9IRVhfUkVDT1JELCAqUElOVEVMX0hFWF9SRUNPUkQ7CgovKiBpbmNsdWRlIGZpcm13YXJlICh2YXJpYWJsZXMpKi8KCi8qIEZJWE1FOiBUaGlzIGlzIHF1aWNrIGFuZCBkaXJ0eSBzb2x1dGlvbiEgKi8KI2RlZmluZSBTUERJRgkvKiBpZiB5b3Ugd2FudCBTUERJRiBjb21tZW50IG5leHQgbGluZSAqLwovLyN1bmRlZiBTUERJRgkvKiBpZiB5b3Ugd2FudCBNSURJIHVuY29tbWVudCB0aGlzIGxpbmUgKi8gCgojaWZkZWYgU1BESUYKIyAgaW5jbHVkZSAiZW1pNjJfZndfcy5oIiAvKiBzcGRpZiBmdyAqLwojZWxzZQojICBpbmNsdWRlICJlbWk2Ml9md19tLmgiIC8qIG1pZGkgZncgKi8KI2VuZGlmCgojZGVmaW5lIEVNSTYyX1ZFTkRPUl9JRCAJCTB4MDg2YSAgLyogRW1hZ2ljIFNvZnQtdW5kIEhhcmR3YXJlIEdtQkggKi8KI2RlZmluZSBFTUk2Ml9QUk9EVUNUX0lECQkweDAxMTAJLyogRU1JIDZ8Mm0gd2l0aG91dCBmaXJtd2FyZSAqLwoKI2RlZmluZSBBTkNIT1JfTE9BRF9JTlRFUk5BTAkweEEwCS8qIFZlbmRvciBzcGVjaWZpYyByZXF1ZXN0IGNvZGUgZm9yIEFuY2hvciBVcGxvYWQvRG93bmxvYWQgKFRoaXMgb25lIGlzIGltcGxlbWVudGVkIGluIHRoZSBjb3JlKSAqLwojZGVmaW5lIEFOQ0hPUl9MT0FEX0VYVEVSTkFMCTB4QTMJLyogVGhpcyBjb21tYW5kIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgY29yZS4gUmVxdWlyZXMgZmlybXdhcmUgKi8KI2RlZmluZSBBTkNIT1JfTE9BRF9GUEdBCTB4QTUJLyogVGhpcyBjb21tYW5kIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgY29yZS4gUmVxdWlyZXMgZmlybXdhcmUuIEVtYWdpYyBleHRlbnNpb24gKi8KI2RlZmluZSBNQVhfSU5URVJOQUxfQUREUkVTUwkweDFCM0YJLyogVGhpcyBpcyB0aGUgaGlnaGVzdCBpbnRlcm5hbCBSQU0gYWRkcmVzcyBmb3IgdGhlIEFOMjEzMVEgKi8KI2RlZmluZSBDUFVDU19SRUcJCTB4N0Y5MiAgLyogRVotVVNCIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3Rlci4gIEJpdCAwIGNvbnRyb2xzIDgwNTEgcmVzZXQgKi8gCiNkZWZpbmUgSU5URVJOQUxfUkFNKGFkZHJlc3MpICAgKGFkZHJlc3MgPD0gTUFYX0lOVEVSTkFMX0FERFJFU1MpCgpzdGF0aWMgaW50IGVtaTYyX3dyaXRlbWVtb3J5KCBzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBpbnQgYWRkcmVzcywgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbmd0aCwgX191OCBiUmVxdWVzdCk7CnN0YXRpYyBpbnQgZW1pNjJfc2V0X3Jlc2V0KHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgcmVzZXRfYml0KTsKc3RhdGljIGludCBlbWk2Ml9sb2FkX2Zpcm13YXJlIChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KTsKc3RhdGljIGludCBlbWk2Ml9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKTsKc3RhdGljIHZvaWQgZW1pNjJfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CnN0YXRpYyBpbnQgX19pbml0IGVtaTYyX2luaXQgKHZvaWQpOwpzdGF0aWMgdm9pZCBfX2V4aXQgZW1pNjJfZXhpdCAodm9pZCk7CgoKLyogdGhhbmtzIHRvIGRyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuX3BkYS5jIGNvZGUgKi8Kc3RhdGljIGludCBlbWk2Ml93cml0ZW1lbW9yeSAoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgaW50IGFkZHJlc3MsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW5ndGgsIF9fdTggcmVxdWVzdCkKewoJaW50IHJlc3VsdDsKCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9ICBrbWFsbG9jIChsZW5ndGgsIEdGUF9LRVJORUwpOwoKCWlmICghYnVmZmVyKSB7CgkJZXJyKCJlbWk2Mjoga21hbGxvYyglZCkgZmFpbGVkLiIsIGxlbmd0aCk7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgltZW1jcHkgKGJ1ZmZlciwgZGF0YSwgbGVuZ3RoKTsKCS8qIE5vdGU6IHVzYl9jb250cm9sX21zZyByZXR1cm5zIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yIG9yIGxlbmd0aCBvZiB0aGUKCSAqIAkJIGRhdGEgdGhhdCB3YXMgd3JpdHRlbiEgKi8KCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyAoZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwgcmVxdWVzdCwgMHg0MCwgYWRkcmVzcywgMCwgYnVmZmVyLCBsZW5ndGgsIDMwMCk7CglrZnJlZSAoYnVmZmVyKTsKCXJldHVybiByZXN1bHQ7Cn0KCi8qIHRoYW5rcyB0byBkcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbl9wZGEuYyBjb2RlICovCnN0YXRpYyBpbnQgZW1pNjJfc2V0X3Jlc2V0IChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIHJlc2V0X2JpdCkKewoJaW50IHJlc3BvbnNlOwoJaW5mbygiJXMgLSAlZCIsIF9fRlVOQ1RJT05fXywgcmVzZXRfYml0KTsKCQoJcmVzcG9uc2UgPSBlbWk2Ml93cml0ZW1lbW9yeSAoZGV2LCBDUFVDU19SRUcsICZyZXNldF9iaXQsIDEsIDB4YTApOwoJaWYgKHJlc3BvbnNlIDwgMCkgewoJCWVycigiZW1pNjI6IHNldF9yZXNldCAoJWQpIGZhaWxlZCIsIHJlc2V0X2JpdCk7Cgl9CglyZXR1cm4gcmVzcG9uc2U7Cn0KCiNkZWZpbmUgRldfTE9BRF9TSVpFCQkxMDIzCgpzdGF0aWMgaW50IGVtaTYyX2xvYWRfZmlybXdhcmUgKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpCnsKCWludCBlcnI7CglpbnQgaTsKCWludCBwb3MgPSAwOwkvKiBQb3NpdGlvbiBpbiBoZXggcmVjb3JkICovCglfX3UzMiBhZGRyOwkvKiBBZGRyZXNzIHRvIHdyaXRlICovCglfX3U4ICpidWY7CgoJZGV2X2RiZygmZGV2LT5kZXYsICJsb2FkX2Zpcm13YXJlXG4iKTsKCWJ1ZiA9IGttYWxsb2MoRldfTE9BRF9TSVpFLCBHRlBfS0VSTkVMKTsKCWlmICghYnVmKSB7CgkJZXJyKCAiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19GVU5DVElPTl9fLCAtRU5PTUVNKTsKCQllcnIgPSAtRU5PTUVNOwoJCWdvdG8gd3JhcGVycjsKCX0KCgkvKiBBc3NlcnQgcmVzZXQgKHN0b3AgdGhlIENQVSBpbiB0aGUgRU1JKSAqLwoJZXJyID0gZW1pNjJfc2V0X3Jlc2V0KGRldiwxKTsKCWlmIChlcnIgPCAwKSB7CgkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIGVycik7CgkJZ290byB3cmFwZXJyOwoJfQoKCS8qIDEuIFdlIG5lZWQgdG8gcHV0IHRoZSBsb2FkZXIgZm9yIHRoZSBGUEdBIGludG8gdGhlIEVaLVVTQiAqLwoJZm9yIChpPTA7IGdfZW1pNjJfbG9hZGVyW2ldLnR5cGUgPT0gMDsgaSsrKSB7CgkJZXJyID0gZW1pNjJfd3JpdGVtZW1vcnkoZGV2LCBnX2VtaTYyX2xvYWRlcltpXS5hZGRyZXNzLCBnX2VtaTYyX2xvYWRlcltpXS5kYXRhLCBnX2VtaTYyX2xvYWRlcltpXS5sZW5ndGgsIEFOQ0hPUl9MT0FEX0lOVEVSTkFMKTsKCQlpZiAoZXJyIDwgMCkgewoJCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKCQkJZ290byB3cmFwZXJyOwoJCX0KCX0KCgkvKiBEZS1hc3NlcnQgcmVzZXQgKGxldCB0aGUgQ1BVIHJ1bikgKi8KCWVyciA9IGVtaTYyX3NldF9yZXNldChkZXYsMCk7CgoJLyogMi4gV2UgdXBsb2FkIHRoZSBGUEdBIGZpcm13YXJlIGludG8gdGhlIEVNSQoJICogTm90ZTogY29sbGVjdCB1cCB0byAxMDIzICh5ZXMhKSBieXRlcyBhbmQgc2VuZCB0aGVtIHdpdGgKCSAqIGEgc2luZ2xlIHJlcXVlc3QuIFRoaXMgaXMgX211Y2hfIGZhc3RlciEgKi8KCWRvIHsKCQlpID0gMDsKCQlhZGRyID0gZ19lbWk2MmJzW3Bvc10uYWRkcmVzczsKCgkJLyogaW50ZWwgaGV4IHJlY29yZHMgYXJlIHRlcm1pbmF0ZWQgd2l0aCB0eXBlIDAgZWxlbWVudCAqLwoJCXdoaWxlICgoZ19lbWk2MmJzW3Bvc10udHlwZSA9PSAwKSAmJiAoaSArIGdfZW1pNjJic1twb3NdLmxlbmd0aCA8IEZXX0xPQURfU0laRSkpIHsKCQkJbWVtY3B5KGJ1ZiArIGksIGdfZW1pNjJic1twb3NdLmRhdGEsIGdfZW1pNjJic1twb3NdLmxlbmd0aCk7CgkJCWkgKz0gZ19lbWk2MmJzW3Bvc10ubGVuZ3RoOwoJCQlwb3MrKzsKCQl9CgkJZXJyID0gZW1pNjJfd3JpdGVtZW1vcnkoZGV2LCBhZGRyLCBidWYsIGksIEFOQ0hPUl9MT0FEX0ZQR0EpOwoJCWlmIChlcnIgPCAwKSB7CgkJCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19GVU5DVElPTl9fLCBlcnIpOwoJCQlnb3RvIHdyYXBlcnI7CgkJfQoJfSB3aGlsZSAoaSA+IDApOwoKCS8qIEFzc2VydCByZXNldCAoc3RvcCB0aGUgQ1BVIGluIHRoZSBFTUkpICovCgllcnIgPSBlbWk2Ml9zZXRfcmVzZXQoZGV2LDEpOwoJaWYgKGVyciA8IDApIHsKCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKCQlnb3RvIHdyYXBlcnI7Cgl9CgoJLyogMy4gV2UgbmVlZCB0byBwdXQgdGhlIGxvYWRlciBmb3IgdGhlIGZpcm13YXJlIGludG8gdGhlIEVaLVVTQiAoYWdhaW4uLi4pICovCglmb3IgKGk9MDsgZ19lbWk2Ml9sb2FkZXJbaV0udHlwZSA9PSAwOyBpKyspIHsKCQllcnIgPSBlbWk2Ml93cml0ZW1lbW9yeShkZXYsIGdfZW1pNjJfbG9hZGVyW2ldLmFkZHJlc3MsIGdfZW1pNjJfbG9hZGVyW2ldLmRhdGEsIGdfZW1pNjJfbG9hZGVyW2ldLmxlbmd0aCwgQU5DSE9SX0xPQURfSU5URVJOQUwpOwoJCWlmIChlcnIgPCAwKSB7CgkJCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19GVU5DVElPTl9fLCBlcnIpOwoJCQlnb3RvIHdyYXBlcnI7CgkJfQoJfQoKCS8qIERlLWFzc2VydCByZXNldCAobGV0IHRoZSBDUFUgcnVuKSAqLwoJZXJyID0gZW1pNjJfc2V0X3Jlc2V0KGRldiwwKTsKCWlmIChlcnIgPCAwKSB7CgkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIGVycik7CgkJZ290byB3cmFwZXJyOwoJfQoKCS8qIDQuIFdlIHB1dCB0aGUgcGFydCBvZiB0aGUgZmlybXdhcmUgdGhhdCBsaWVzIGluIHRoZSBleHRlcm5hbCBSQU0gaW50byB0aGUgRVotVVNCICovCgovKiBGSVhNRTogcXVpY2sgYW5kIGRpcnR5IGlmZGVmcyAqLwojaWZkZWYgU1BESUYKCWZvciAoaT0wOyBnX0hleFNwZGlmRnc2MltpXS50eXBlID09IDA7IGkrKykgewoJCWlmICghSU5URVJOQUxfUkFNKGdfSGV4U3BkaWZGdzYyW2ldLmFkZHJlc3MpKSB7CgkJCWVyciA9IGVtaTYyX3dyaXRlbWVtb3J5KGRldiwgZ19IZXhTcGRpZkZ3NjJbaV0uYWRkcmVzcywgZ19IZXhTcGRpZkZ3NjJbaV0uZGF0YSwgZ19IZXhTcGRpZkZ3NjJbaV0ubGVuZ3RoLCBBTkNIT1JfTE9BRF9FWFRFUk5BTCk7CgkJCWlmIChlcnIgPCAwKSB7CgkJCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKCQkJCWdvdG8gd3JhcGVycjsKCQkJfQoJCX0KCX0KI2Vsc2UgLyogTUlESSAqLwoJZm9yIChpPTA7IGdfSGV4TWlkaUZ3NjJbaV0udHlwZSA9PSAwOyBpKyspIHsKCQlpZiAoIUlOVEVSTkFMX1JBTShnX0hleE1pZGlGdzYyW2ldLmFkZHJlc3MpKSB7CgkJCWVyciA9IGVtaTYyX3dyaXRlbWVtb3J5KGRldiwgZ19IZXhNaWRpRnc2MltpXS5hZGRyZXNzLCBnX0hleE1pZGlGdzYyW2ldLmRhdGEsIGdfSGV4TWlkaUZ3NjJbaV0ubGVuZ3RoLCBBTkNIT1JfTE9BRF9FWFRFUk5BTCk7CgkJCWlmIChlcnIgPCAwKSB7CgkJCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBlcnIpOwoJCQkJZ290byB3cmFwZXJyOwoJCQkJcmV0dXJuIGVycjsKCQkJfQoJCX0KCX0KI2VuZGlmCQoJLyogQXNzZXJ0IHJlc2V0IChzdG9wIHRoZSBDUFUgaW4gdGhlIEVNSSkgKi8KCWVyciA9IGVtaTYyX3NldF9yZXNldChkZXYsMSk7CglpZiAoZXJyIDwgMCkgewoJCWVycigiJXMgLSBlcnJvciBsb2FkaW5nIGZpcm13YXJlOiBlcnJvciA9ICVkIiwgX19GVU5DVElPTl9fLCBlcnIpOwoJCWdvdG8gd3JhcGVycjsKCX0KCi8qIEZJWE1FOiBxdWljayBhbmQgZGlydHkgaWZkZWZzICovCiNpZmRlZiBTUERJRgoJZm9yIChpPTA7IGdfSGV4U3BkaWZGdzYyW2ldLnR5cGUgPT0gMDsgaSsrKSB7CgkJaWYgKElOVEVSTkFMX1JBTShnX0hleFNwZGlmRnc2MltpXS5hZGRyZXNzKSkgewoJCQllcnIgPSBlbWk2Ml93cml0ZW1lbW9yeShkZXYsIGdfSGV4U3BkaWZGdzYyW2ldLmFkZHJlc3MsIGdfSGV4U3BkaWZGdzYyW2ldLmRhdGEsIGdfSGV4U3BkaWZGdzYyW2ldLmxlbmd0aCwgQU5DSE9SX0xPQURfSU5URVJOQUwpOwoJCQlpZiAoZXJyIDwgMCkgewoJCQkJZXJyKCIlcyAtIGVycm9yIGxvYWRpbmcgZmlybXdhcmU6IGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIGVycik7CgkJCQlnb3RvIHdyYXBlcnI7CgkJCX0KCQl9Cgl9CiNlbHNlIC8qIE1JREkgKi8KCWZvciAoaT0wOyBnX0hleE1pZGlGdzYyW2ldLnR5cGUgPT0gMDsgaSsrKSB7CgkJaWYgKElOVEVSTkFMX1JBTShnX0hleE1pZGlGdzYyW2ldLmFkZHJlc3MpKSB7CgkJCWVyciA9IGVtaTYyX3dyaXRlbWVtb3J5KGRldiwgZ19IZXhNaWRpRnc2MltpXS5hZGRyZXNzLCBnX0hleE1pZGlGdzYyW2ldLmRhdGEsIGdfSGV4TWlkaUZ3NjJbaV0ubGVuZ3RoLCBBTkNIT1JfTE9BRF9JTlRFUk5BTCk7CgkJCWlmIChlcnIgPCAwKSB7CgkJCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBlcnIpOwoJCQkJZ290byB3cmFwZXJyOwoJCQl9CgkJfQoJfQojZW5kaWYKCQoJLyogRGUtYXNzZXJ0IHJlc2V0IChsZXQgdGhlIENQVSBydW4pICovCgllcnIgPSBlbWk2Ml9zZXRfcmVzZXQoZGV2LDApOwoJaWYgKGVyciA8IDApIHsKCQllcnIoIiVzIC0gZXJyb3IgbG9hZGluZyBmaXJtd2FyZTogZXJyb3IgPSAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKCQlnb3RvIHdyYXBlcnI7Cgl9CgoJa2ZyZWUoYnVmKTsKCgkvKiByZXR1cm4gMSB0byBmYWlsIHRoZSBkcml2ZXIgaW5pYWxpemF0aW9uCgkgKiBhbmQgZ2l2ZSByZWFsIGRyaXZlciBjaGFuZ2UgdG8gbG9hZCAqLwoJcmV0dXJuIDE7Cgp3cmFwZXJyOgoJa2ZyZWUoYnVmKTsKCWRldl9lcnIoJmRldi0+ZGV2LCAiRXJyb3JcbiIpOwoJcmV0dXJuIGVycjsKfQoKc3RhdGljIF9fZGV2aW5pdGRhdGEgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGUgW10gPSB7Cgl7IFVTQl9ERVZJQ0UoRU1JNjJfVkVORE9SX0lELCBFTUk2Ml9QUk9EVUNUX0lEKSB9LAoJeyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGVybWluYXRpbmcgZW50cnkgKi8KfTsKCk1PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgaWRfdGFibGUpOwoKc3RhdGljIGludCBlbWk2Ml9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQp7CglzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKCWRldl9kYmcoJmludGYtPmRldiwgImVtaTYyX3Byb2JlXG4iKTsKCglpbmZvKCIlcyBzdGFydCIsIF9fRlVOQ1RJT05fXyk7IAoKCWVtaTYyX2xvYWRfZmlybXdhcmUoZGV2KTsKCgkvKiBkbyBub3QgcmV0dXJuIHRoZSBkcml2ZXIgY29udGV4dCwgbGV0IHJlYWwgYXVkaW8gZHJpdmVyIGRvIHRoYXQgKi8KCXJldHVybiAtRUlPOwp9CgpzdGF0aWMgdm9pZCBlbWk2Ml9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQp7Cn0KCnN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBlbWk2Ml9kcml2ZXIgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkubmFtZQkJPSAiZW1pNjIgLSBmaXJtd2FyZSBsb2FkZXIiLAoJLnByb2JlCQk9IGVtaTYyX3Byb2JlLAoJLmRpc2Nvbm5lY3QJPSBlbWk2Ml9kaXNjb25uZWN0LAoJLmlkX3RhYmxlCT0gaWRfdGFibGUsCn07CgpzdGF0aWMgaW50IF9faW5pdCBlbWk2Ml9pbml0ICh2b2lkKQp7CglpbnQgcmV0dmFsOwoJcmV0dmFsID0gdXNiX3JlZ2lzdGVyICgmZW1pNjJfZHJpdmVyKTsKCWlmIChyZXR2YWwpCgkJcHJpbnRrKEtFUk5fRVJSICJhZGktZW1pOiByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKCXJldHVybiByZXR2YWw7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBlbWk2Ml9leGl0ICh2b2lkKQp7Cgl1c2JfZGVyZWdpc3RlciAoJmVtaTYyX2RyaXZlcik7Cn0KCm1vZHVsZV9pbml0KGVtaTYyX2luaXQpOwptb2R1bGVfZXhpdChlbWk2Ml9leGl0KTsKCk1PRFVMRV9BVVRIT1IoInRhcGlvIGxheHN0cvZtIik7Ck1PRFVMRV9ERVNDUklQVElPTigiRW1hZ2ljIEVNSSA2fDJtIGZpcm13YXJlIGxvYWRlci4iKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKLyogdmk6YWk6c3ludGF4PWM6c3c9ODp0cz04OnR3PTgwCiAqLwo=