Ly8gQ29weXJpZ2h0IChjKSAyMDEyIEdDVCBTZW1pY29uZHVjdG9yLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCiNpZiAhZGVmaW5lZCAoV0lNQVhUWVBFX0hfMjAxMDAzMTApCiNkZWZpbmUgV0lNQVhUWVBFX0hfMjAxMDAzMTAKI2luY2x1ZGUgPHdjaGFyLmg+CgovKioKICogXGZpbGUgV2lNYXhUeXBlLmgKICogV2lNYXhUeXBlLmgKICogRGVmaW5lcyB0aGUgZGF0YSB0eXBlcyB1c2VkIHRocm91Z2hvdXQgdGhlIFdpTWF4IENvbW1vbiBBUEkKICogVmVyc2lvbiAxLjIuMSBOb3ZlbXZlciAyIDIwMDcKICovCgojZGVmaW5lCVRZUEVfRVhURU5TSU9OCS8qZGVmaW5lZCBieSBHQ1QqLwoKLy8vIG1heGltdW0gbGVuZ3RoIG9mIGEgTlNQIG5hbWUKI2RlZmluZSBNQVhfU0laRV9PRl9OU1BfTkFNRSAgICAgICAoMTI4KzEpCgovLy8gbWF4aW11bSBsZW5ndGggb2YgYSBzdHJpbmcgYnVmZmVyCiNkZWZpbmUgTUFYX1NJWkVfT0ZfU1RSSU5HX0JVRkZFUiAgMjU2CgovLy8gdW5zaWduZWQgOC1iaXQKdHlwZWRlZiB1bnNpZ25lZCBjaGFyICBVSU5UODsKCi8vLyBzaWduZWQgMTYtYml0CnR5cGVkZWYgc2hvcnQgICAgICAgICAgSU5UMTY7CgovLy8gdW5zaWduZWQgMTYtYml0CnR5cGVkZWYgdW5zaWduZWQgc2hvcnQgVUlOVDE2OyAgCgovLy8gdW5zaWduZWQgMTYtYml0IGNoYXIKI2lmIDEJLypJbiBsaW51eCwgc2l6ZW9mKHdjaGFyX3QpIGlzIDQqLwp0eXBlZGVmIHdjaGFyX3QgICAgICAgICBVQ0hBUjE2OwojZWxzZQp0eXBlZGVmIFVJTlQxNiAgICAgICAgIFVDSEFSMTY7CiNlbmRpZgoKLy8KLy8gSU5UMzIgYW5kIFVJTlQzMiBhcmUgYWxyZWFkeSBkZWZpbmVkIGluIHdpbmRvd3MuCi8vCiNpZm5kZWYgX1dJTjMyIAojaWZuZGVmIF9XSU42NAoKLy8vIHNpZ25lZCAzMi1iaXQKdHlwZWRlZiBpbnQgSU5UMzI7CgovLy8gdW5zaWduZWQgMzItYml0CnR5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQzMjsKCiNlbmRpZgojZW5kaWYKCiNpZmRlZglUWVBFX0VYVEVOU0lPTgovLwovLyBCT09MIGlzIGFscmVhZHkgZGVmaW5lZCBpbiB3aW5kb3dzLgovLwojaWZuZGVmIF9XSU4zMiAKI2lmbmRlZiBfV0lONjQKI2lmICFkZWZpbmVkKFVJQ0NfQ18yMDA5MDgwNikKLy8vIHNpZ25lZCAzMi1iaXQKdHlwZWRlZiBpbnQgQk9PTDsKI2VuZGlmCgojZW5kaWYKI2VuZGlmCgovLy8gc2lnbmVkIDY0LWJpdAp0eXBlZGVmIGxvbmcgbG9uZyAgICAgICAgICBJTlQ2NDsgCgovLy8gdW5zaWduZWQgNjQtYml0CnR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIFVJTlQ2NDsgCiNlbmRpZgoKLy8vIDgtYml0IHN0cmluZyBudWxsIHRlcm1pbmF0ZWQKdHlwZWRlZiBVSU5UOCogIFdJTUFYX0FQSV9TVFJJTkc7IAoKLy8vIDE2LWJpdCBzdHJpbmcgKHVuaWNvZGUpIFVURi0xNiBudWxsIHRlcm1pbmF0ZWQKdHlwZWRlZiBVQ0hBUjE2KiBXSU1BWF9BUElfV1NUUklORzsgIAoKLy8vIDMyLWJpdCBwcm9maWxlIGlkCi8vLyBQcm9maWxlIGlkIDAgaXMgcmVzZXJ2ZSB0byBjb25uZWN0aW9uIHdpdGhvdXQgc3BlY2lmeWluZyBhIHVzZXIgYWNjb3VudC4KdHlwZWRlZiBVSU5UMzIgIFdJTUFYX0FQSV9QUk9GSUxFX0lEOyAgICAgCgovLy8gRW51bWVyYXRpb24gb2YgYWxsIHRoZSBwcml2aWxlZ2UgbGV2ZWwuCnR5cGVkZWYgZW51bSBfV0lNQVhfQVBJX1BSSVZJTEVHRQp7CglXSU1BWF9BUElfUFJJVklMRUdFX1JFQURfV1JJVEUsIC8qKjwgUmVhZCBXcml0ZSBwcml2aWxlZ2UgYWNjZXNzLiAqLwoJV0lNQVhfQVBJX1BSSVZJTEVHRV9SRUFEX09OTFksICAvKio8IFJlYWQgT25seSBwcml2aWxlZ2UgYWNjZXNzLiAqLwp9IFdJTUFYX0FQSV9QUklWSUxFR0U7CgoKLy8vIEVudW1lcmF0aW9uIGNhcmQgcHJlc2VuY2Ugc3RhdGUuCnR5cGVkZWYgZW51bSBfV0lNQVhfQVBJX0RFVklDRV9QUkVTRU5DRQp7CglXSU1BWF9BUElfQ0FSRF9SRU1PVkFMLCAgICAgICAgIC8qKjwgY2FyZCByZW1vdmFsIGVudW0gdmFsdWUgMCAqLwoJV0lNQVhfQVBJX0NBUkRfSU5TRVJUSU9OLCAgICAgICAvKio8IGNhcmQgaW5zZXJ0aW9uIGVudW0gdmFsdWUgMSAqLwp9IFdJTUFYX0FQSV9ERVZJQ0VfUFJFU0VOQ0U7CgovLy8gRW51bWVyYXRpb24gZGV2aWNlIHR5cGUuCnR5cGVkZWYgZW51bSBfV0lNQVhfQVBJX0RFVklDRV9UWVBFCnsKCVdJTUFYX0FQSV9ERVZfVFlQRV9XSU1BWAkJLyoqPCBXaU1heCBkZXZpY2UgdHlwZSAqLwp9IFdJTUFYX0FQSV9ERVZJQ0VfVFlQRTsKCi8vLyBkZXZpY2UgaWRlbnRpZmljYXRpb24gc3RydWN0dXJlCnR5cGVkZWYgc3RydWN0IF9XSU1BWF9BUElfREVWSUNFX0lECnsKCVVJTlQzMgkJCQkgIHN0cnVjdHVyZVNpemU7ICAgICAgICAvKio8IHNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUuICovCglVSU5UMzIJCQkJICBzZGtIYW5kbGU7ICAgICAgICAgICAgLyoqPCBIYW5kbGUgdGhhdCBpcyBjb25maWd1cmVkIGJ5IHRoZSB2ZW5kb3Igc3BlY2lmaWMgU0RLIGFuZCB1c2FnZSBpcyBsaW1pdGVkIGluc2lkZSB0aGUgU0RLIGZvciB2ZW5kb3Igc3BlY2lmaWMgcmVmZXJlbmNlcy4gKi8KCQkJCQkJCQkJCQkJLyoqPCBUaGUgU0RLIGhhbmRsZSBpcyBzZXQgYW5kIHVzZWQgb25seSBieSB0aGUgU0RLLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLiAqLwoJCQkJCQkJCQkJCQkvKio8IFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgZm9yIGVhY2ggdmVuZG9yLiAqLwoJV0lNQVhfQVBJX1BSSVZJTEVHRQkgIHByaXZpbGVnZTsgICAgICAgICAgICAvKio8IFJlYWQgb25seSBvciByZWFkIHdyaXRlICovCglVSU5UOAkJCQkgIGRldmljZUluZGV4OyAgICAgICAgICAvKio8IFRoZSBpbmRleCBvZiB0aGUgZGV2aWNlLiBUaGUgZGV2aWNlIGluZGV4IDAgaXMgcmVzZXJ2ZWQuIDAgZXF1YWwgbm8gZGV2aWNlLiAqLwoJVUlOVDMyCQkJCSAgYXBpVmVyc2lvbjsgICAgICAgICAgIC8qKjwgTVNCIDE2Yml0cyBhcmUgdGhlIG1ham9yIHJlbGVhc2UgbnVtYmVyLCBMU0IgMTYgYml0cyBhcmUgdGhlIG1pbm9yIHJlbGVhc2UgbnVtYmVyICovCiAgICBCT09MICAgICAgICAgICAgICAgICAgZGV2aWNlUHJlc2VuY2VTdGF0dXM7IC8qKjwgVGhlIGRldmljZSBwcmVzZW5jZSBzdGF0dXMgKi8KfSBXSU1BWF9BUElfREVWSUNFX0lELCAqV0lNQVhfQVBJX0RFVklDRV9JRF9QOwoKLy8vIEhhcmR3YXJlIElECnR5cGVkZWYgc3RydWN0IF9XSU1BWF9BUElfSFdfREVWSUNFX0lECnsKCVVJTlQzMgkJCQkJc3RydWN0dXJlU2l6ZTsgICAgIC8qKjwgc2l6ZSBvZiB0aGlzIHN0cnVjdHVyZS4gKi8KCVVJTlQ4CQkJCQlkZXZpY2VJbmRleDsgICAgICAgLyoqPCBUaGUgaW5kZXggb2YgdGhlIGRldmljZS4gVGhlIGluZGV4IG11c3Qgc3RheSB0aGUgc2FtZSBmb3IgYSBkZXZpY2UgdW50aWwgdGhlIFNESyBpcyBjbG9zZWQuICovCglVQ0hBUjE2ICAgICAgICAgICAgICAgICBkZXZpY2VOYW1lW01BWF9TSVpFX09GX1NUUklOR19CVUZGRVJdOyAgLyoqPCBOYW1lIG9mIHRoZSBkZXZpY2UuIE11c3QgYmUgdGhlIHNhbWUgbmFtZSB0aGVuIHRoZSBPUyBkZXZpY2UgbmFtZS4gICovCgkJCQkJCQkJCQkJICAgLyoqPCBGb3Igd2luZG93cyBpdCBzaGFsbCBiZSB0aGUgc2FtZSBuYW1lIGFwcGVhcmluZyBpbiB0aGUgZGV2aWNlIGRyaXZlci4gKi8KCVdJTUFYX0FQSV9ERVZJQ0VfVFlQRSAgIGRldmljZVR5cGU7ICAgICAgICAvKio8IFRoZSB0eXBlIG9mIHRoZSBkZXZpY2UgKi8KfSBXSU1BWF9BUElfSFdfREVWSUNFX0lELCAqV0lNQVhfQVBJX0hXX0RFVklDRV9JRF9QOwoKLy8vIERldmljZSBzdGF0dXMgZW51bQp0eXBlZGVmIGVudW0gX1dJTUFYX0FQSV9MT0NLX1NUQVRVUwp7CglXSU1BWF9BUElfREVWSUNFX0xPQ0tFRCwgICAgLyoqPCBEZXZpY2UgaXMgbG9ja2VkICovCglXSU1BWF9BUElfREVWSUNFX1VOTE9DS0VELCAgLyoqPCBEZXZpY2UgaXMgdW5sb2NrZWQgKi8KfSBXSU1BWF9BUElfTE9DS19TVEFUVVMsICpXSU1BWF9BUElfTE9DS19TVEFUVVNfUDsKCi8vLyBOZXR3b3JrIHR5cGUgZW51bQp0eXBlZGVmIGVudW0gX1dJTUFYX0FQSV9ORVRXT1JLX1RZUEUKewoJV0lNQVhfQVBJX0hPTUUsICAgICAgICAgICAgICAvKio8IEhvbWUgbmV0d29yayAqLwogICAgV0lNQVhfQVBJX1BBUlRORVIsICAgICAgICAgICAvKio8IFBhcnRuZXIgbmV0d29yaywgdGhpcyBpcyBhIE5TUCBpbiB0aGUgQ0FQTC4gVGhpcyBpcyB0cmVhdGVkIGFzIGEgaG9tZSBuZXR3b3JrLiAqLwoJV0lNQVhfQVBJX1JPQU1JTkdfUEFSVE5FUiwgICAvKio8IFJvYW1pbmcgcGFydG5lciBuZXR3b3JrLCB0aGlzIGlzIGEgTlNQIGluIHRoZSBSQVBMLiAqLwoJV0lNQVhfQVBJX1VOS05PV04gICAgICAgICAgICAvKio8IFVua25vd24gbmV0d29yayAqLwp9IFdJTUFYX0FQSV9ORVRXT1JLX1RZUEU7CgovLy8gTlNQIGluZm9ybWF0aW9uIHN0cnVjdHVyZQp0eXBlZGVmIHN0cnVjdCBfV0lNQVhfQVBJX05TUF9JTkZPCnsKCVVJTlQzMiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlU2l6ZTsgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGlzIHN0cnVjdHVyZS4gKi8KCVVDSEFSMTYgICAgICAgICAgICAgICAgICAgTlNQTmFtZVtNQVhfU0laRV9PRl9OU1BfTkFNRV07IC8qKjwgdGhlIG5hbWUgb2YgdGhlIE5TUCAqLwoJVUlOVDMyICAgICAgICAgICAgICAgICAgICBOU1BpZDsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJZGVudGlmaWVyICovCglVSU5UOCAgICAgICAgICAgICAgICAgICAgIFJTU0k7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFJTU0kgdmFsdWUgKi8KCVVJTlQ4ICAgICAgICAgICAgICAgICAgICAgQ0lOUjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ0lOUiB2YWx1ZSAqLyAgCglXSU1BWF9BUElfTkVUV09SS19UWVBFICAgIG5ldHdvcmtUeXBlOyAgICAgICAgICAgICAgICAgICAvKio8IEN1cnJlbnQgbmV0d29yayB0eXBlICovICAgIAp9IFdJTUFYX0FQSV9OU1BfSU5GTywgKldJTUFYX0FQSV9OU1BfSU5GT19QOwoKLy8vIExpbmsgc3RhdHVzIGluZm9ybWF0aW9uIHN0cnVjdHVyZQp0eXBlZGVmIHN0cnVjdCBfV0lNQVhfQVBJX0xJTktfU1RBVFVTX0lORk8KewoJVUlOVDMyICAgICAgICAgICAgIHN0cnVjdHVyZVNpemU7ICAgICAgLyoqPCBzaXplIG9mIHRoaXMgc3RydWN0dXJlLiAqLwoJVUlOVDMyICAgICAgICAgICAgIGNlbnRlckZyZXF1ZW5jeTsgICAgLyoqPCBDZW50ZXIgZnJlcXVuY3kgb2YgdGhlIGN1cnJlbnQgbGluayBmcm9tIGRldmljZSB0byBuZXR3b3JrLCBpbiB1bml0IG9mIEtIeiAqLwogICAJVUlOVDggICAgICAgICAgICAgIFJTU0k7ICAgICAgICAgICAgICAgLyoqPCBNZWFuIFJTU0kgbWVhc3VyZWQgYnkgZGV2aWNlLiBBcyBhY2NvcmRpbmcgdG8gSUVFRSA4MDIuMTYgc3RhbmRhcmQsIHZhbHVlcyBhcmUgcmFuZ2luZyBmcm9tIDB4MDAgdG8gMHg1Mywgd2hlcmUgLTEyM2RCbSBpcyBlbmNvZGVkIGFzIDB4MDAgYW5kIC00MGRCbSBlbmNvZGVkIGFzIDB4NTMgd2l0aCAxZEIgaW5jcmVtZW50cy4gKi8gCglVSU5UOCAgICAgICAgICAgICAgQ0lOUjsgICAgICAgICAgICAgICAvKio8IE1lYW4gUlNTSSBtZWFzdXJlZCBieSBkZXZpY2UuIEFzIGFjY29yZGluZyB0byBJRUVFIDgwMi4xNiBzdGFuZGFyZCwgdmFsdWVzIGFyZSByYW5naW5nIGZyb20gMHgwMCB0byAweDNGLCB3aGVyZSAtMTBkQiBpcyBlbmNvZGVkIGFzIDB4MDAgYW5kIDUzZEIgZW5jb2RlZCBhcyAweDNGIHdpdGggMWRCIGluY3JlbWVudHMuICovCglVSU5UOCAgICAgICAgICAgICAgdHhQV1I7ICAgICAgICAgICAgICAvKio8IEF2ZXJhZ2UgdHJhbnNtaXQgcG93ZXIgZm9yIHRoZSBsYXN0IGJ1cnN0IHRyYW5zbWl0dGVkIGJ5IHRoZSBkZXZpY2UuIEJhc2VkIG9uIElFRUU4MDIuMTYgc3RhbmRhcmQsIHRoZSB2YWx1ZXMgYXJlIHJhbmdpbmcgZnJvbSAweHh4IHRvIDB4RkYsIHdoZXJlIC04NGRCbSBpcyBlbmNvZGVkIGFzIDB4MDAgIGFuZCA0My41ZEJtIGlzIGVuY29kZWQgYXMgMHhGRiB3aXRoIDAuNWRCIGluY3JlbWVudC4gKi8KCVVJTlQ4ICAgICAgICAgICAgICBic0lkWzZdOyAgICAgICAgICAgIC8qKjwgQlMgSUQgb2YgdGhlIGN1cnJlbnQgc2VydmluZyBCUyBhcyByZWNlaXZlZCBmcm9tIHRoZSBuZXR3b3JrICovCn0gV0lNQVhfQVBJX0xJTktfU1RBVFVTX0lORk8sICpXSU1BWF9BUElfTElOS19TVEFUVVNfSU5GT19QOwoKLy8vIFByb2ZpbGUgaW5mb3JtYXRpb24gc3RydWN0dXJlCnR5cGVkZWYgc3RydWN0IF9XSU1BWF9BUElfUFJPRklMRV9JTkZPCnsKCVVJTlQzMiAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVTaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoaXMgc3RydWN0dXJlLiAqLwoJV0lNQVhfQVBJX1BST0ZJTEVfSUQgIHByb2ZpbGVJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHByb2ZpbGUgSUQuIFByb2ZpbGUgaWQgMCBpcyByZXNlcnZlIHRvIGNvbm5lY3Rpb24gd2l0aG91dCBzcGVjaWZ5aW5nIGEgdXNlciBhY2NvdW50LiAqLwoJVUNIQVIxNiAgICAgICAgICAgICAgIHByb2ZpbGVOYW1lW01BWF9TSVpFX09GX1NUUklOR19CVUZGRVJdOyAvKio8IHByb2ZpbGUgbmFtZS4gVGhlIHByb2ZpbGUgbmFtZSBpcyB0aGUgbmFtZSBmcm9tIHRlaCBPTUEtRE0gdHJlZS4qLyAKfSBXSU1BWF9BUElfUFJPRklMRV9JTkZPLCAqV0lNQVhfQVBJX1BST0ZJTEVfSU5GT19QOwoKLy8vIERldmljZSB2ZXJzaW9uCnR5cGVkZWYgc3RydWN0IF9XSU1BWF9BUElfREVWSUNFX1ZFUlNJT04KewoJVUlOVDMyICAgIHN0cnVjdHVyZVNpemU7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGlzIHN0cnVjdHVyZS4gKi8KCVVDSEFSMTYgICBuYW1lW01BWF9TSVpFX09GX1NUUklOR19CVUZGRVJdOyAgICAvKio8IG5hbWUgb2YgdGhlIHBhcnRzLCBzdWNoIGFzIEFTSUMsIEJvYXJkLCBSRiwgU1cgU3lzdGVtLiAqLwoJVUNIQVIxNiAgIHZlcnNpb25bTUFYX1NJWkVfT0ZfU1RSSU5HX0JVRkZFUl07IC8qKjwgVmVyc2lvbiBvZiB0aGUgcGFydCAqLwp9IFdJTUFYX0FQSV9ERVZJQ0VfVkVSU0lPTiwgKldJTUFYX0FQSV9ERVZJQ0VfVkVSU0lPTl9QOwoKLy8vIERldmljZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKdHlwZWRlZiBzdHJ1Y3QgX1dJTUFYX0FQSV9ERVZJQ0VfSU5GTwp7CglVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUuICovCglXSU1BWF9BUElfREVWSUNFX1ZFUlNJT04gICAgaHdWZXJzaW9uOyAgICAgICAgICAgICAgICAvKio8IEhhcmR3YXJlIHZlcnNpb24gKi8KCVdJTUFYX0FQSV9ERVZJQ0VfVkVSU0lPTiAgICBzd1ZlcnNpb247ICAgICAgICAgICAgICAgIC8qKjwgU1cgdmVyc2lvbiAqLwoJV0lNQVhfQVBJX0RFVklDRV9WRVJTSU9OICAgIHJmVmVyc2lvbjsgICAgICAgICAgICAgICAgLyoqPCBSRiB2ZXJzaW9uICovCglXSU1BWF9BUElfREVWSUNFX1ZFUlNJT04gICAgYXNpY1ZlcnNpb247ICAgICAgICAgICAgICAvKio8IEFTSUMgVmVyc2lvbiAqLwogCVVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICBtYWNBZGRyZXNzWzZdOyAgICAgICAgICAgIC8qKjwgQVMgZGVmaW5lZCBieSBJRUVFODAyLjE2IHN0YW5kYXJkLCA0OGJpdHMgZGV2aWNlIE1BQyBhZGRyZXNzICovCglVQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgdmVuZG9yTmFtZVtNQVhfU0laRV9PRl9TVFJJTkdfQlVGRkVSXTsgLyoqPCBOYW1lIG9mIHRoZSBoYXJkd2FyZSB2ZW5kb3IgKi8KCUJPT0wgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JTcGVjaWZpY0luZm9JbmNsOyAgIC8qKjwgSW5kaWNhdGluZyB0aGUgaW5jbHVzaW9uIG9mIHZlbmRvciBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwogICAgVUNIQVIxNiAgICAgICAgICAgICAgICAgICAgIHZlbmRvclNwZWNpZmljSW5mb1tNQVhfU0laRV9PRl9TVFJJTkdfQlVGRkVSXTsgLyoqIDxWZW5kb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KfSBXSU1BWF9BUElfREVWSUNFX0lORk8sICpXSU1BWF9BUElfREVWSUNFX0lORk9fUDsKCi8vLyBEZXZpY2Ugc3RhdHVzIGVudW0KdHlwZWRlZiBlbnVtIF9XSU1BWF9BUElfREVWSUNFX1NUQVRVUwp7CglXSU1BWF9BUElfREVWSUNFX1NUQVRVU19VbkluaXRpYWxpemVkLCAgLyoqPCAgRGV2aWNlIGlzIHVuaW5pdGlhbGl6ZWQgKi8KCVdJTUFYX0FQSV9ERVZJQ0VfU1RBVFVTX1JGX09GRl9IV19TVywgICAvKio8ICBEZXZpY2UgUkYgT2ZmKGJvdGggSC9XIGFuZCBTL1cpICovCglXSU1BWF9BUElfREVWSUNFX1NUQVRVU19SRl9PRkZfSFcsICAgICAgLyoqPCAgRGV2aWNlIFJGIE9mZih2aWEgSC9XIHN3aXRjaCkgKi8KCVdJTUFYX0FQSV9ERVZJQ0VfU1RBVFVTX1JGX09GRl9TVywgICAgICAvKio8ICBEZXZpY2UgUkYgT2ZmKHZpYSBTL1cgc3dpdGNoKSAqLwoJV0lNQVhfQVBJX0RFVklDRV9TVEFUVVNfUmVhZHksICAgICAgICAgIC8qKjwgIERldmljZSBpcyByZWFkeSAqLwoJV0lNQVhfQVBJX0RFVklDRV9TVEFUVVNfU2Nhbm5pbmcsICAgICAgIC8qKjwgIERldmljZSBpcyBzY2FubmluZyAqLwoJV0lNQVhfQVBJX0RFVklDRV9TVEFUVVNfQ29ubmVjdGluZywgICAgIC8qKjwgIENvbm5lY3Rpb24gaW4gcHJvZ3Jlc3MgKi8KCVdJTUFYX0FQSV9ERVZJQ0VfU1RBVFVTX0RhdGFfQ29ubmVjdGVkCS8qKjwgIExheWVyIDIgY29ubmVjdGVkICovCn0gV0lNQVhfQVBJX0RFVklDRV9TVEFUVVMsICpXSU1BWF9BUElfREVWSUNFX1NUQVRVU19QOwoKLy8vIENvbm5lY3Rpb24gcHJvZ3Jlc3MgaW5mb3JtYXRpb24gc3RydWN0dXJlCnR5cGVkZWYgZW51bSBfV0lNQVhfQVBJX0NPTk5FQ1RJT05fUFJPR1JFU1NfSU5GTwp7CglXSU1BWF9BUElfREVWSUNFX0NPTk5FQ1RJT05fUFJPR1JFU1NfUmFuZ2luZywgICAgICAgICAgICAgICAgICAgLyoqPCBEZXZpY2UgaXMgaW4gUmFuZ2luZyAqLwoJV0lNQVhfQVBJX0RFVklDRV9DT05ORUNUSU9OX1BST0dSRVNTX1NCQywgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgRGV2aWNlIGlzIGluIFNCQyAqLwoJV0lNQVhfQVBJX0RFVklDRV9DT05ORUNUSU9OX1BST0dSRVNTX0VBUF9hdXRoZW50aWNhdGlvbl9EZXZpY2UsIC8qKjwgRGV2aWNlIGlzIGluIEVBUCBhdXRoZW50aWNhdGlvbiBEZXZpY2UgKi8KCVdJTUFYX0FQSV9ERVZJQ0VfQ09OTkVDVElPTl9QUk9HUkVTU19FQVBfYXV0aGVudGljYXRpb25fVXNlciwgICAvKio8IERldmljZSBpcyBpbiBFQVAgYXV0aGVudGljYXRpb24gVXNlciAqLwogCVdJTUFYX0FQSV9ERVZJQ0VfQ09OTkVDVElPTl9QUk9HUkVTU18zX3dheV9oYW5kc2hha2UsICAgICAgICAgICAvKio8IERldmljZSBpcyBpbiAzLXdheS1oYW5kc2hha2UgKi8KCVdJTUFYX0FQSV9ERVZJQ0VfQ09OTkVDVElPTl9QUk9HUkVTU19SZWdpc3RyYXRpb24sICAgICAgICAgICAgICAvKio8IERldmljZSBpcyBpbiBSZWdpc3RyYXRpb24gKi8KCVdJTUFYX0FQSV9ERVZJQ0VfQ09OTkVDVElPTl9QUk9HUkVTU19EZV9yZWdpc3RyYXRpb24sICAgICAgICAgICAvKio8IERldmljZSBpcyBpbiBEZS1yZWdpc3RyYXRpb24gKi8KCVdJTUFYX0FQSV9ERVZJQ0VfQ09OTkVDVElPTl9QUk9HUkVTU19SZWdpc3RlcmVkLAkJICAgICAgICAvKio8IERldmljZSBpcyByZWdpc3RlcmVkIChvcGVyYXRpb25hbCkgKi8KCVdJTUFYX0FQSV9ERVZJQ0VfQ09OTkVDVElPTl9QUk9HUkVTU19SZWdpc3RyYXRpb25fRFNYLCAgICAgICAgICAvKio8IERldmljZSBpcyBpbiBSZWdpc3RyYXRpb24gRFNYICovCn0gV0lNQVhfQVBJX0NPTk5FQ1RJT05fUFJPR1JFU1NfSU5GTywgKldJTUFYX0FQSV9DT05ORUNUSU9OX1BST0dSRVNTX0lORk9fUDsKCi8vLyBUaGUgc3RzdHVzIHJlYXNvbiBlbnVtCnR5cGVkZWYgZW51bSBfV0lNQVhfQVBJX1NUQVRVU19SRUFTT04KewoJV0lNQVhfQVBJX1NUQVRVU19SRUFTT05fTm9ybWFsLAoJV0lNQVhfQVBJX1NUQVRVU19SRUFTT05fRmFpbF90b19jb25uZWN0X3RvX05XLCAgICAgICAgICAgLyoqPCBGYWlsZWQgdG8gY29tcGxldGUgTlcgZW50cnkgd2l0aCB0aGUgc2VsZWN0ZWQgb3BlcmF0b3IgKHVuc3BlY2lmaWVkIHJlYXNvbikuICAqLwoJV0lNQVhfQVBJX1NUQVRVU19SRUFTT05fRmFpbF90b19jb25uZWN0X1JhbmdpbmcsICAgICAgICAgLyoqPCBGYWlsZWQgdG8gY29tcGxldGUgcmFuZ2luZyAqLwoJV0lNQVhfQVBJX1NUQVRVU19SRUFTT05fRmFpbF90b19jb25uZWN0X1NCQywgICAgICAgICAgICAgLyoqPCBTQkMgcGhhc2UgZmFpbGVkICovCglXSU1BWF9BUElfU1RBVFVTX1JFQVNPTl9GYWlsX3RvX2Nvbm5lY3RfRUFQX0FVVEhfRGV2aWNlLCAvKio8IFNlY3VyaXR5IGVycm9yLiBFQVAgYXV0aGVudGljYXRpb24gZmFpbGVkIGRldmljZSBsZXZlbCAqLwoJV0lNQVhfQVBJX1NUQVRVU19SRUFTT05fRmFpbF90b19jb25uZWN0X0VBUF9BVVRIX3VzZXIsICAgLyoqPCBTZWN1cml0eSBlcnJvci4gRUFQIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCB1c2VyIGxldmVsICovCglXSU1BWF9BUElfU1RBVFVTX1JFQVNPTl9GYWlsX3RvX2Nvbm5lY3RfM19XYXlfSGFuZHNoYWtlLCAvKio8IFNlY3VyaXR5IGVycm9yLiBIYW5kc2hha2UgZmFpbGVkICovCglXSU1BWF9BUElfU1RBVFVTX1JFQVNPTl9GYWlsX3RvX2Nvbm5lY3RfUkVHLCAgICAgICAgICAgICAvKio8IFJlZ2lzdHJhdGlvbiBmYWlsZWQgKi8KCVdJTUFYX0FQSV9TVEFUVVNfUkVBU09OX0ZhaWxfdG9fY29ubmVjdF9kYXRhcGF0aAkgICAgIC8qKjwgRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIGRhdGEgcGF0aCAoZmFpbGVkIHRvIHBlcmZvcm0gRFNBIHRvIG9uZSBVTCBhbmQgb25lIERMIFNGcykuICovCn0gV0lNQVhfQVBJX1NUQVRVU19SRUFTT047CgovLy8gUkYgU3RhdHVzIGVudW0KdHlwZWRlZiBzdHJ1Y3QgX1dJTUFYX0FQSV9SRl9TV0lUQ0hFU19TVEFUVVMKewoJVUlOVDMyICAgc3RydWN0dXJlU2l6ZTsgLyoqPCBzaXplIG9mIHRoaXMgc3RydWN0dXJlLiAqLwoJQk9PTCAgICAgaHdfUkZfT047ICAgICAgLyoqPCBIYXJkd2FyZSBSRiBpcyBvbiAqLwoJQk9PTCAgICAgc3dfUkZfT047ICAgICAgLyoqPCBTb2Z0d2FyZSBSRiBpcyBvbiAqLyAKfSBXSU1BWF9BUElfUkZfU1dJVENIRVNfU1RBVFVTLCAqV0lNQVhfQVBJX1JGX1NXSVRDSEVTX1NUQVRVU19QOwoKLy8vIENvbm5lY3RlZCBOU1AgaW5mb3JtYXRpb24gc3RydWN0dXJlCnR5cGVkZWYgc3RydWN0IF9XSU1BWF9BUElfQ09OTkVDVEVEX05TUF9JTkZPCnsKCVVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVTaXplOyAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoaXMgc3RydWN0dXJlLiAqLwoJVUNIQVIxNiAgICAgICAgICAgICAgICAgICAgIE5TUE5hbWVbTUFYX1NJWkVfT0ZfTlNQX05BTUVdOyAvKio8IE5hbWUgb2YgTlNQICovCglVQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgTlNQUmVhbG1bTUFYX1NJWkVfT0ZfTlNQX05BTUVdOy8qKjwgTmFtZSBvZiBOU1AgKi8KCVVJTlQzMiAgICAgICAgICAgICAgICAgICAgICBOU1BpZDsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJZGVudGlmaWVyICovCglCT09MICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGVkOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgSXMgdGhlIGRldmljZSBhY3RpdmF0ZWQgVFJVRT1BY3RpdmF0ZWQgRkFMU0U9Tm90QWN0aXZhdGVkICovCglVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgUlNTSTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWVhbiBSU1NJIG1lYXN1cmVkIGJ5IGRldmljZS4gQXMgYWNjb3JkaW5nIHRvIElFRUUgODAyLjE2IHN0YW5kYXJkLCB2YWx1ZXMgYXJlIHJhbmdpbmcgZnJvbSAweDAwIHRvIDB4NTMsIHdoZXJlIC0xMjNkQm0gaXMgZW5jb2RlZCBhcyAweDAwIGFuZCAtNDBkQm0gZW5jb2RlZCBhcyAweDUzIHdpdGggMWRCIGluY3JlbWVudHMuICovCglVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgQ0lOUjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTWVhbiBSU1NJIG1lYXN1cmVkIGJ5IGRldmljZS4gQXMgYWNjb3JkaW5nIHRvIElFRUUgODAyLjE2IHN0YW5kYXJkLCB2YWx1ZXMgYXJlIHJhbmdpbmcgZnJvbSAweDAwIHRvIDB4M0YsIHdoZXJlIC0xMGRCIGlzIGVuY29kZWQgYXMgMHgwMCBhbmQgNTNkQiBlbmNvZGVkIGFzIDB4M0Ygd2l0aCAxZEIgaW5jcmVtZW50cy4gKi8KCVdJTUFYX0FQSV9ORVRXT1JLX1RZUEUgICAgICBuZXR3b3JrVHlwZTsgICAgICAgICAgICAgICAgICAgLyoqPCBDdXJyZW50IG5ldHdvcmsgdHlwZSAqLwp9IFdJTUFYX0FQSV9DT05ORUNURURfTlNQX0lORk8sICpXSU1BWF9BUElfQ09OTkVDVEVEX05TUF9JTkZPX1A7CgovLy8gUm9hbWluZyBtb2RlCnR5cGVkZWYgZW51bSBfV0lNQVhfQVBJX1JPQU1JTkdfTU9ERQp7ICAKCVdJTUFYX0FQSV9ST0FNSU5HX0VOQUJMRUQsICAvKio8IEVuYWJsZSAtIENvbm5lY3Rpb24gdG8gcm9hbWluZyBwYXJ0bmVyIE5TUHMgaXMgYWxsb3dlZC4gKi8KCVdJTUFYX0FQSV9ST0FNSU5HX0RJU0FCTEVEICAvKio8IERpc2FibGUgLSBDb25uZWN0aW9uIHRvIHJvYW1pbmcgcGFydG5lciBOU1BzIGlzIE5PVCBhbGxvd2VkLiAqLyAKfSBXSU1BWF9BUElfUk9BTUlOR19NT0RFLCAqV0lNQVhfQVBJX1JPQU1JTkdfTU9ERV9QOwoKLy8vIENvbm5lY3Rpb24gc3RhdGlzdGljIHN0cnVjdHVyZQp0eXBlZGVmIHN0cnVjdCBfV0lNQVhfQVBJX0NPTk5FQ1RJT05fU1RBVAp7CglVSU5UMzIgICBzdHJ1Y3R1cmVTaXplOyAgICAvKio8IHNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUuICovCglVSU5UMzIgICB0b3RhbFJ4Qnl0ZTsgICAgICAvKio8IFRvdGFsIHRyYW5zbWl0dGVkIGJ5dGVzIG9mIHBheWxvYWQgdHJhZmZpYyovCglVSU5UMzIgICB0b3RhbFR4Qnl0ZTsgICAgICAvKio8IFRvdGFsIHJlY2VpdmVkIGJ5dGVzIG9mIHBheWxvYWQgdHJhZmZpYyovCglVSU5UMzIgICB0b3RhbFJ4UGFja2V0czsgICAvKio8IFRvdGFsIG51bWJlciBvZiByZWNlaXZlZCBwYWNrZXQuIEVxdWl2YWxlbnQgdG8gSVAgcGFja2V0LiAqLyAKICAgIFVJTlQzMiAgIHRvdGFsVHhQYWNrZXRzOyAgIC8qKjwgVG90YWwgbnVtYmVyIG9mIHRyYW5zbWl0dGVkIHBhY2tldC4gRXF1aXZhbGVudCB0byBJUCBwYWNrZXQuICovCn0gV0lNQVhfQVBJX0NPTk5FQ1RJT05fU1RBVCwgKldJTUFYX0FQSV9DT05ORUNUSU9OX1NUQVRfUDsKCi8vLyBDb250YWN0IHR5cGUgYXMgZGVmaW5lZCBpbiBUYWJsZSA1IHNlY3Rpb24gQTkuMy4xLjQuMSBvZiBOTUdfT1RBX1Byb3Zpc2lvbmluZ19TcGVjaWZpY2F0aW9uc19WMC41LU9NQS1ETSBzZWUgYmVsb3cuIAovLy8gMCA9PSBNYW5kYXRvcnkgY29udGFjdCBub2RlIGZvciB0aGUgb3BlcmF0b3KScyBUZWNobmljYWwgU3VwcG9ydCBjb250YWN0IGluZm9ybWF0aW9uLiAKLy8vIDEgPT0gTWFuZGF0b3J5IGNvbnRhY3Qgbm9kZSBmb3Igb3BlcmF0b3KScyBTdWJzY3JpcHRpb24gUG9ydGFsIGNvbnRhY3QgaW5mb3JtYXRpb24uIAovLy8gMi0xOTkgPT0gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIAovLy8gMjAwLTI1NSA9PSBvcGVyYXRvciBkZWZpbmVkIFVSSSBUeXBlcyAoZS5nLjsgTXkgYWNjb3VudCwgRkFRLCBldGMuKS4gCnR5cGVkZWYgVUlOVDE2IFdJTUFYX0FQSV9DT05UQUNUX1RZUEU7CgovLy8gQ29udGFjdCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKdHlwZWRlZiBzdHJ1Y3QgX1dJTUFYX0FQSV9DT05UQUNUX0lORk8KewoJVUlOVDMyCQkJCQkJc3RydWN0dXJlU2l6ZTsJCQkJCQkJLyoqPCBzaXplIG9mIHRoaXMgc3RydWN0dXJlLiAqLwoJVUNIQVIxNgkJCQkJCXRleHRGb3JVUklbTUFYX1NJWkVfT0ZfU1RSSU5HX0JVRkZFUl07CS8qKjwgVGV4dCBjb21pbmcgd2l0aCBVUkkuICovCgkJCQkJCQkJCQkJCQkJCQkJCS8qKjwgVGhlIHRleHQgc2hvdWxkIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci4gVGhlIHRleHQgc2hhbGwgYmUgbG9jYWxpemVkIGJ5IHRoZSBuZXR3b3JrLiAqLwoJVUNIQVIxNgkJCQkJCVVSSVtNQVhfU0laRV9PRl9TVFJJTkdfQlVGRkVSXTsJCQkvKio8IFVSSSB0byBiZSBkaXNwbGF5ZWQuICovCglXSU1BWF9BUElfQ09OVEFDVF9UWVBFCQljb250YWN0VHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDb250YWN0IHR5cGUuICovCn0gV0lNQVhfQVBJX0NPTlRBQ1RfSU5GTywgKldJTUFYX0FQSV9DT05UQUNUX0lORk9fUDsKCi8vLyBQcm92aXNpb24gb3BlcmF0aW9uIGVudW0KLy8vIFdoZW4gdGhlIGRldmljZSBpcyBub3QgYWN0aXZhdGVkLCByZWNlaXZpbmcgYSB1cGRhdGUgc3RhcnRlZCBub3RpZmljYXRpb24gY2FuIGJlIGludGVycHJldGVkIGFzIGFjdGl2YXRpbmcgdGhlIGRldmljZS4KdHlwZWRlZiBlbnVtIF9XSU1BWF9BUElfUFJPVl9PUEVSQVRJT04KewoJV0lNQVhfQVBJX1BST1ZfT1BFUkFUSU9OX0NGR19VUERBVEVfU1RBUlRFRCwgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgVXBkYXRlIGhhcyBzdGFydGVkICovCglXSU1BWF9BUElfUFJPVl9PUEVSQVRJT05fQ0ZHX1VQREFURV9DT01QTEVURUQsCSAgICAgICAgICAgICAgICAgICAvKio8IFVwZGF0ZSBoYXMgY29tcGxldGVkICovCglXSU1BWF9BUElfUFJPVl9PUEVSQVRJT05fQ0ZHX1VQREFURV9GQUlMRURfTkVUV09SS19ESVNDT05ORUNULCAgICAgLyoqPCBVcGRhdGUgZmFpbGVkIGJlY2F1c2Ugb2YgbmV0d29yayBkaXNjb25uZWN0Ki8KCVdJTUFYX0FQSV9QUk9WX09QRVJBVElPTl9DRkdfVVBEQVRFX0ZBSUxFRCwgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFVwZGF0ZSBmYWlsZWQgKi8KCVdJTUFYX0FQSV9QUk9WX09QRVJBVElPTl9DRkdfVVBEQVRFX0ZBSUxFRF9JTlZBTElEX1BST1ZJU0lPTklORywgICAvKio8IFVwZGF0ZSBmYWlsZWQgYmVjYXVzZSBvZiBpbnZhbGlkIHByb3Zpc2lvbmluZyAqLwoJV0lNQVhfQVBJX1BST1ZfT1BFUkFUSU9OX0NGR19VUERBVEVfRkFJTEVEX0JBRF9BVVRIRU5USUNBVElPTiwgICAgIC8qKjwgVXBkYXRlIGZhaWxlZCBiZWNhdXNlIG9mIGF1dGhlbnRpY2F0aW9uIGZhaWx1cmUgKi8KCVdJTUFYX0FQSV9QUk9WX09QRVJBVElPTl9DRkdfVVBEQVRFX1JFUVVFU1RfSU5JVElBTF9QUk9WSVNJT05JTkcsICAvKio8IFVwZGF0ZSByZXF1ZXN0ZWQgaW5pdGlhbCBwcm92aXNpb25pbmcgKi8KCVdJTUFYX0FQSV9QUk9WX09QRVJBVElPTl9DRkdfVVBEQVRFX1JFUVVFU1RfT05HT0lOR19QUk9WSVNJT05JTkcsICAvKio8IFVwZGF0ZSBvbmdvaW5nIHByb3Zpc2lvbmluZyAqLwoJV0lNQVhfQVBJX1BST1ZfT1BFUkFUSU9OX0NGR19VUERBVEVfUkVRVUVTVF9SRVNFVF9QUk9WSVNJT05JTkcsICAgIC8qKjwgVXBkYXRlIHJlcXVlc3RlZCByZXNldCBwcm92aXNpb25pbmcgKi8KCVdJTUFYX0FQSV9QUk9WX09QRVJBVElPTl9DRkdfVVBEQVRFX1RSSUdHRVJfQ09OVEFDVCwgICAgICAgICAgICAgICAvKio8IFNwZWNpZmllcyB0byBpbnZva2UgdGhlIFVSSSBzcGVjaWZpZWQgaW4gdGhlIGNvbnRhY3QgaW5mb3JtYXRpb24uICovCgkJCQkJCQkJCQkJCQkJCQkJICAgLyoqPCBUaGUgY29udGFjdFR5cGUgcGFyYW1ldGVyIGluIHRoZSBJbmRQcm92aXNpb25pbmdPcGVyYXRpb24gZGVmaW5lcyB0aGUgY29udGFjdCBVUkkgdG8gdHJpZ2dlci4gKi8KCQkJCQkJCQkJCQkJCQkJCQkgICAvKio8IFVwb24gcmVjZWl2aW5nIHRoZSB0cmdnZXIgY29udGFjdCBub3RpZmljYXRpb24sIENNIHNoYWxsIHJlZnJlc2ggdGhlIGNvbnRhY3QgbGlzdCBieSBjYWxsaW5nIEdldENvbnRhY3RJbmZvcm1hdGlvbi4gKi8KfSBXSU1BWF9BUElfUFJPVl9PUEVSQVRJT047CgovLy8gUGFja2FnZSB1cGRhdGUgZW51bQp0eXBlZGVmIGVudW0gX1dJTUFYX0FQSV9QQUNLX1VQREFURQp7CglXSU1BWF9BUElfUEFDS19VUERBVEVfUkVDRUlWRUQsICAgICAgICAgICAgICAgICAgIC8qKjwgUmVxdWVzdCB0byBkb3dubG9hZCBub3RpZmljYXRpb24gcmVjZWl2ZWQuICovCglXSU1BWF9BUElfUEFDS19VUERBVEVfUkVDRUlWRURfTE9XRVJfU1RBQ0ssICAgICAgIC8qKjwgVXBkYXRlIHBhY2thZ2UgcmVjZWl2ZWQgZm9yIGZpcm13YXJlIHVwZGF0ZSBvbmx5Ki8KCVdJTUFYX0FQSV9QQUNLX1VQREFURV9SRUNFSVZFRF9GVUxMX1NUQUNLLCAgICAgICAgLyoqPCBVcGRhdGUgcGFja2FnZSByZWNlaXZlZCBmb3IgZmlybXdhcmUsIFNESyBhbmQgZHJpdmVyKi8KCVdJTUFYX0FQSV9QQUNLX1VQREFURV9SRUNFSVZFRF9PTUFfRE1fQ0xJRU5ULCAgICAgLyoqPCBVcGRhdGUgcGFja2FnZSByZWNlaXZlZCBmb3IgT01BLURNIGNsaWVudCovCglXSU1BWF9BUElfUEFDS19VUERBVEVfU1RBUlRFRCwgICAgICAgICAgICAgICAgICAgIC8qKjwgUmVxdWVzdCB0byBpbnN0YWxsIHBhY2thZ2UgKi8KCVdJTUFYX0FQSV9QQUNLX1VQREFURV9DT01QTEVURUQsICAgICAgICAgICAgICAgICAgLyoqPCBVcGRhdGUgcGFja2FnZSBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkICovCglXSU1BWF9BUElfUEFDS19VUERBVEVfRkFJTEVEX05FVFdPUktfRElTQ09OTkVDVEVELC8qKjwgVXBkYXRlIHBhY2thZ2UgZmFpbGVkIHRvIGluc3RhbGwgYmVjYXVzZSBvZiBuZXR3b3JrIGRpc2Nvbm5lY3Rpb24qLwoJV0lNQVhfQVBJX1BBQ0tfVVBEQVRFX0ZBSUxFRF9JTlZBTElEX1BBQ0tBR0UsICAgICAvKio8IFVwZGF0ZSBwYWNrYWdlIGZhaWxlZCB0byBpbnN0YWxsIGJlY2F1c2Ugb2YgaW52YWxpZCBwYWNrYWdlKi8KCVdJTUFYX0FQSV9QQUNLX1VQREFURV9GQUlMRURfQkFEX0FVVEhFTlRJQ0FUSU9OLCAgLyoqPCBVcGRhdGUgcGFja2FnZSBmYWlsZWQgdG8gaW5zdGFsbCBiZWNhdXNlIG9mIGJhcyBhdXRoZW50aWNhdGlvbiAqLwoJV0lNQVhfQVBJX1BBQ0tfVVBEQVRFX0ZBSUxFRCwgICAgICAgICAgICAgICAgICAgICAvKio8IFVwZGF0ZSBwYWNrYWdlIGZhaWxlZCB0byBpbnN0YWxsICovCn0gV0lNQVhfQVBJX1BBQ0tfVVBEQVRFOwoKLy8vIFBhY2thZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlCnR5cGVkZWYgc3RydWN0IF9XSU1BWF9BUElfUEFDS0FHRV9JTkZPCnsKCVVJTlQzMiAgIHN0cnVjdHVyZVNpemU7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUuICovCglVQ0hBUjE2ICBmaWxlUGF0aFtNQVhfU0laRV9PRl9TVFJJTkdfQlVGRkVSXTsgLyoqPCBmaWxlIHBhdGguICovIAoJVUNIQVIxNiAgZmlsZU5hbWVbTUFYX1NJWkVfT0ZfU1RSSU5HX0JVRkZFUl07IC8qKjwgZmlsZSBuYW1lLiAqLyAKCUJPT0wgICAgIGZvcmNlUmVib290OyAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IChUUlVFID0gUmVib290IHJlcXVpcmVkLCBGQUxTRSBObyByZWJvb3QgcmVxdWlyZWQpIDEuMiBCRVNUIFBSQUNUSUNFLCB0aGlzIGY7YWcgc2hhbGwgbm90IGJlIHVzZWQuKi8KCUJPT0wgICAgIG1hbmRhdG9yeVVwZGF0ZTsgICAgICAgICAgICAgICAgICAgICAvKio8IChUUlVFID0gbWFuZGF0b3J5IEZBTFNFLCBvcHRpb25hbCkgMS4yIEJFU1QgUFJBQ1RJQ0UsIHRoaXMgZjthZyBzaGFsbCBub3QgYmUgdXNlZC4gKi8KCUJPT0wgICAgIHdhcm5Vc2VyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IChUUlVFID0gd2FybiB1c2VyLCBGQUxTRSA9IG5vIHVzZXIgd2FybmluZyAqLwp9IFdJTUFYX0FQSV9QQUNLQUdFX0lORk8sICpXSU1BWF9BUElfUEFDS0FHRV9JTkZPX1A7CgovLy8gUGFja2FnZSB1cGRhdGUgc3RhdGUKdHlwZWRlZiBlbnVtIF9XSU1BWF9BUElfUEFDS0FHRV9VUERBVEVfU1RBVEUKewoJV0lNQVhfQVBJX1BBQ0tBR0VfVVBEQVRFX0RFTEFZLAkJLyoqPCBQYWNrYWdlIHVwZGF0ZSB3YXMgbm90IGFjY2VwdGVkIGJ5IHRoZSB1c2VyLiAqLwoJV0lNQVhfQVBJX1BBQ0tBR0VfVVBEQVRFX0FDQ0VQVEVELAkvKio8IFBhY2thZ2UgdXBkYXRlIHdhcyBhY2NlcHRlZCBieSB0aGUgdXNlci4gKi8KCVdJTUFYX0FQSV9QQUNLQUdFX1VQREFURV9ERU5JRUQsCS8qKjwgUGFja2FnZSB1cGRhdGUgd2FzIGRlbmllZCBieSB0aGUgdXNlci4gKi8KfSBXSU1BWF9BUElfUEFDS0FHRV9VUERBVEVfU1RBVEU7CgovLy8gUkYgc3RhdGUgZW51bQp0eXBlZGVmIGVudW0gX1dJTUFYX0FQSV9SRl9TVEFURQp7CglXSU1BWF9BUElfUkZfT04sICAgLyoqPCBSRiBpcyBvbi4gKi8KICAgIFdJTUFYX0FQSV9SRl9PRkYgICAvKio8IFJGIGlzIG9mZi4gKi8JCn0gV0lNQVhfQVBJX1JGX1NUQVRFOwoKLy8vIENvbm5lY3Rpb24gcmVzcG9uc2UgZW51bQp0eXBlZGVmIGVudW0gX1dJTUFYX0FQSV9ORVRXT1JLX0NPTk5FQ1RJT05fUkVTUAp7CglXSU1BWF9BUElfQ09OTkVDVElPTl9TVUNDRVNTLCAgICAgLyoqPCBjb25uZWN0aW9uIHN1Y2Nlc3MgKi8KCVdJTUFYX0FQSV9DT05ORUNUSU9OX0ZBSUxVUkUgICAgICAvKio8IGNvbm5lY3Rpb24gZmFpbHVyZSAqLyAKfSBXSU1BWF9BUElfTkVUV09SS19DT05ORUNUSU9OX1JFU1A7CgovLy8gSVAgSW50ZXJmYWNlIGluZm9ybWF0aW9uIHN0cnVjdHVyZQp0eXBlZGVmIHN0cnVjdCBfV0lNQVhfQVBJX0lOVEVSRkFDRV9JTkZPCnsKCVVJTlQzMiAgIHN0cnVjdHVyZVNpemU7CQkJCQkJCQkvKio8IHNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUuICovCglVQ0hBUjE2ICBpbnRlcmZhY2VOYW1lW01BWF9TSVpFX09GX1NUUklOR19CVUZGRVJdOwkvKio8IGludGVyZmFjZSBuYW1lLiBUaGlzIGlzIGEgc3RyaW5nIGNhcHRpb24gdG8gYmUgY29tcGF0aWJsZSBmb3IgYWxsIE9TLiAqLyAKfSBXSU1BWF9BUElfSU5URVJGQUNFX0lORk8sICpXSU1BWF9BUElfSU5URVJGQUNFX0lORk9fUDsKCi8vLyBUaGUgc3RhdHVzZXMgcHJvdmlkZWQgYnkgdGhpcyBBUEkgY2FuIGdlbmVyYWxseSBiZSBtYXBwZWQgdG8gbW92ZW1lbnRzIGFsb25nIHRoZSBTREsgY29tbW9uIHN0YXRlIG1hY2hpbmUuIFRoZSBpbmRpY2F0aW9ucyBtYXkgcHJvdmlkZSBmdXJ0aGVyIGRldGFpbGVkIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBBUEmScyBhcmd1bWVudHMgd2hlbiByZWxldmFudC4KLy8vIFxwYXJhbVtpbl0gcERldmljZUlkIC0gUG9pbnRlciB0byBEZXZpY2UgSWRlbnRpZmllciBwYXNzZWQgb24gb3BlbiBvZiBkZXZpY2UuCi8vLyBccGFyYW1baW5dIGRldmljZVN0YXR1cyAtIFRoZSBkZXZpY2UgU3RhdHVzIHZhbHVlCi8vLyBccGFyYW1baW5dIHN0YXR1c1JlYXNvbiAtIFRoZSBkZXZpY2Ugc3RhdHVzIHJlYXNvbiB2YWx1ZQovLy8gXHBhcmFtW2luXSBjb25uZWN0aW9uUHJvZ3Jlc3NJbmZvIC0gY29ubmVjdGlvbiBQcm9ncmVzcyB2YWx1ZQp0eXBlZGVmIHZvaWQgKCpJbmREZXZpY2VTdGF0dXNVcGRhdGUpKFdJTUFYX0FQSV9ERVZJQ0VfSURfUCBwRGV2aWNlSWQsIFdJTUFYX0FQSV9ERVZJQ0VfU1RBVFVTIGRldmljZVN0YXR1cywgV0lNQVhfQVBJX1NUQVRVU19SRUFTT04gc3RhdHVzUmVhc29uLCBXSU1BWF9BUElfQ09OTkVDVElPTl9QUk9HUkVTU19JTkZPIGNvbm5lY3Rpb25Qcm9ncmVzc0luZm8pOwoKCi8vLyBJbmRpY2F0b3IgYWJvdXQgY2FyZCBpbnNlcnRpb24gYW5kIHJlbW92YWwKLy8vIFxwYXJhbVtpbl0gcERldmljZUlkIC0gUG9pbnRlciB0byBEZXZpY2UgSWRlbnRpZmllciBwYXNzZWQgb24gb3BlbiBvZiBkZXZpY2UuCi8vLyBccGFyYW1baW5dIGNhcmRQcmVzZW5jZSAtIGNhcmQgcHJlc2VuY2UgYm9vbGVhbiB2YWx1ZS4KdHlwZWRlZiB2b2lkICgqSW5kRGV2aWNlSW5zZXJ0UmVtb3ZlKShXSU1BWF9BUElfREVWSUNFX0lEX1AgcERldmljZUlkLCBCT09MIGNhcmRQcmVzZW5jZSk7CgoKLy8vIEluZGljYXRpb24gb2YgUkYgb24vb2ZmIGNoYW5nZXMuICBSRiBwb3dlciBtYXkgYmUgZ2VuZXJhdGVkIGZyb20gZXh0ZXJuYWwgUkYgb2ZmIGV2ZW50IGNhdXNlZCBieSBoYXJkd2FyZSBzd2l0Y2gvY29udHJvbC4KLy8vIFxwYXJhbVtpbl0gcERldmljZUlkIC0gUG9pbnRlciB0byBEZXZpY2UgSWRlbnRpZmllciBwYXNzZWQgb24gb3BlbiBvZiBkZXZpY2UuCi8vLyBccGFyYW1baW5dIHBvd2VyU3RhdGUgLSBJbmRpY2F0aW9uIHRoYXQgdGhlIGRldmljZSBjaGFuZ2VkIHRoaXMgcG93ZXIgc3RhdGUuCnR5cGVkZWYgdm9pZCAoKkluZENvbnRyb2xQb3dlck1hbmFnZW1lbnQpKFdJTUFYX0FQSV9ERVZJQ0VfSURfUCBwRGV2aWNlSWQsIFdJTUFYX0FQSV9SRl9TVEFURSBwb3dlclN0YXRlKTsKCgovLy8gTmV0d29yayBjb25uZWN0IGluZGljYXRpb24uCi8vLyBccGFyYW1baW5dIHBEZXZpY2VJZCAtIFBvaW50ZXIgdG8gRGV2aWNlIElkZW50aWZpZXIgcGFzc2VkIG9uIG9wZW4gb2YgZGV2aWNlLgovLy8gXHBhcmFtW2luXSBuZXR3b3JrQ29ubmVjdGlvblJlc3BvbnNlIC0gQ29ubmVjdGlvbiBzdGF0dXMgdmFsdWUuCnR5cGVkZWYgdm9pZCAoKkluZENvbm5lY3RUb05ldHdvcmspIChXSU1BWF9BUElfREVWSUNFX0lEX1AgcERldmljZUlkLCBXSU1BWF9BUElfTkVUV09SS19DT05ORUNUSU9OX1JFU1AgbmV0d29ya0Nvbm5lY3Rpb25SZXNwb25zZSk7CgoKLy8vIE5ldHdvcmsgZGlzY29ubmVjdCBpbmRpY2F0aW9uLgovLy8gXHBhcmFtW2luXSBwRGV2aWNlSWQgLSBQb2ludGVyIHRvIERldmljZSBJZGVudGlmaWVyIHBhc3NlZCBvbiBvcGVuIG9mIGRldmljZS4KLy8vIFxwYXJhbVtpbl0gbmV0d29ya0Nvbm5lY3Rpb25SZXNwb25zZSAtIENvbm5lY3Rpb24gc3RhdHVzIHZhbHVlLgp0eXBlZGVmIHZvaWQgKCpJbmREaXNjb25uZWN0VG9OZXR3b3JrKSAoV0lNQVhfQVBJX0RFVklDRV9JRF9QIHBEZXZpY2VJZCwgV0lNQVhfQVBJX05FVFdPUktfQ09OTkVDVElPTl9SRVNQIG5ldHdvcmtEaXNjb25uZWN0UmVzcG9uc2UpOwoKCi8vLyBQcm92aWRlIHJlc3VsdHMgb2YgV2lkZSBTY2FuIHNlYXJjaC4KLy8vIFxwYXJhbVtpbl0gcERldmljZUlkIC0gUG9pbnRlciB0byBEZXZpY2UgSWRlbnRpZmllciBwYXNzZWQgb24gb3BlbiBvZiBkZXZpY2UuCi8vLyBccGFyYW1baW5dIHBOc3BMaXN0IC0gUG9pbnRlciB0byBhIHN0cnVjdHVyZSB3aXRoIGluZm9ybWF0aW9uIG9uIE5ldHdvcmtzIGZvdW5kIGR1cmluZyBzZWFyY2guCi8vLyBccGFyYW1baW5dIGxpc3RTaXplIC0gU2l6ZSBvZiB0aGUgTmV0d29yayBsaXN0CnR5cGVkZWYgdm9pZCAoKkluZE5ldHdvcmtTZWFyY2hXaWRlU2NhbikgKFdJTUFYX0FQSV9ERVZJQ0VfSURfUCBwRGV2aWNlSWQsIFdJTUFYX0FQSV9OU1BfSU5GT19QIHBOc3BMaXN0LCBVSU5UMzIgbGlzdFNpemUpOwoKCi8vLyBJbmRpY2F0b3IgZm9yIHByb3Zpc2lvbmluZyBvcGVyYXRpb24uCi8vLyBccGFyYW1baW5dICBwRGV2aWNlSWQgLSBQb2ludGVyIHRvIERldmljZSBJZGVudGlmaWVyIHBhc3NlZCBvbiBvcGVuIG9mIGRldmljZS4KLy8vIFxwYXJhbVtvdXRdIHBDb250YWN0SW5mbyAtIFByb3Zpc2lvbmluZyBpbmZvcm1hdGlvbiBzdGF0dXMuCnR5cGVkZWYgdm9pZCAoKkluZFByb3Zpc2lvbmluZ09wZXJhdGlvbikgKFdJTUFYX0FQSV9ERVZJQ0VfSURfUCBwRGV2aWNlSWQsICBXSU1BWF9BUElfUFJPVl9PUEVSQVRJT04gcHJvdmlzb25pbmdPcGVyYXRpb24sIFdJTUFYX0FQSV9DT05UQUNUX1RZUEUgY29udGFjdFR5cGUpOwoKCi8vLyBJbmRpY2F0b3IgZm9yIHBhY2thZ2UgdXBkYXRlLgovLy8gXHBhcmFtW2luXSAgcERldmljZUlkIC0gUG9pbnRlciB0byBEZXZpY2UgSWRlbnRpZmllciBwYXNzZWQgb24gb3BlbiBvZiBkZXZpY2UuCi8vLyBccGFyYW1bb3V0XSBwYWNrYWdlVXBkYXRlIC0gUGFja2FnZSB1cGRhdGUgc3RhdHVzLgp0eXBlZGVmIHZvaWQgKCpJbmRQYWNrYWdlVXBkYXRlKSAoV0lNQVhfQVBJX0RFVklDRV9JRF9QIHBEZXZpY2VJZCwgV0lNQVhfQVBJX1BBQ0tfVVBEQVRFIHBhY2thZ2VVcGRhdGUpOwojZW5kaWYK