LyoqCiAqIFxmaWxlIGRybV9zYXJlYS5oCiAqIFxicmllZiBTQVJFQSBkZWZpbml0aW9ucwogKgogKiBcYXV0aG9yIE1pY2hlbCBE5G56ZXIgPG1pY2hlbEBkYWVuemVyLm5ldD4KICovCgovKgogKiBDb3B5cmlnaHQgMjAwMiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCiAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCiAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQogKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogKgogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CiAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKICogU29mdHdhcmUuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKICogVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCiAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgogKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqLwoKI2lmbmRlZiBfRFJNX1NBUkVBX0hfCiNkZWZpbmUgX0RSTV9TQVJFQV9IXwoKI2luY2x1ZGUgImRybS5oIgoKLyogU0FSRUEgYXJlYSBuZWVkcyB0byBiZSBhdCBsZWFzdCBhIHBhZ2UgKi8KI2lmIGRlZmluZWQoX19hbHBoYV9fKQojZGVmaW5lIFNBUkVBX01BWCAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwCiNlbGlmIGRlZmluZWQoX19pYTY0X18pCiNkZWZpbmUgU0FSRUFfTUFYICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwCS8qIDY0a0IgKi8KI2Vsc2UKLyogSW50ZWwgODMwTSBkcml2ZXIgbmVlZHMgYXQgbGVhc3QgOGsgU0FSRUEgKi8KI2RlZmluZSBTQVJFQV9NQVggICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAojZW5kaWYKCi8qKiBNYXhpbXVtIG51bWJlciBvZiBkcmF3YWJsZXMgaW4gdGhlIFNBUkVBICovCiNkZWZpbmUgU0FSRUFfTUFYX0RSQVdBQkxFUyAJCTI1NgoKI2RlZmluZSBTQVJFQV9EUkFXQUJMRV9DTEFJTUVEX0VOVFJZICAgIDB4ODAwMDAwMDAKCi8qKiBTQVJFQSBkcmF3YWJsZSAqLwpzdHJ1Y3QgZHJtX3NhcmVhX2RyYXdhYmxlIHsKCXVuc2lnbmVkIGludCBzdGFtcDsKCXVuc2lnbmVkIGludCBmbGFnczsKfTsKCi8qKiBTQVJFQSBmcmFtZSAqLwpzdHJ1Y3QgZHJtX3NhcmVhX2ZyYW1lIHsKCXVuc2lnbmVkIGludCB4OwoJdW5zaWduZWQgaW50IHk7Cgl1bnNpZ25lZCBpbnQgd2lkdGg7Cgl1bnNpZ25lZCBpbnQgaGVpZ2h0OwoJdW5zaWduZWQgaW50IGZ1bGxzY3JlZW47Cn07CgovKiogU0FSRUEgKi8Kc3RydWN0IGRybV9zYXJlYSB7CiAgICAvKiogZmlyc3QgdGhpbmcgaXMgYWx3YXlzIHRoZSBEUk0gbG9ja2luZyBzdHJ1Y3R1cmUgKi8KCXN0cnVjdCBkcm1faHdfbG9jayBsb2NrOwogICAgLyoqIFx0b2RvIFVzZSByZWFkZXJzL3dyaXRlciBsb2NrIGZvciBkcm1fc2FyZWE6OmRyYXdhYmxlX2xvY2sgKi8KCXN0cnVjdCBkcm1faHdfbG9jayBkcmF3YWJsZV9sb2NrOwoJc3RydWN0IGRybV9zYXJlYV9kcmF3YWJsZSBkcmF3YWJsZVRhYmxlW1NBUkVBX01BWF9EUkFXQUJMRVNdOwkvKio8IGRyYXdhYmxlcyAqLwoJc3RydWN0IGRybV9zYXJlYV9mcmFtZSBmcmFtZTsJLyoqPCBmcmFtZSAqLwoJZHJtX2NvbnRleHRfdCBkdW1teV9jb250ZXh0Owp9OwoKI2lmbmRlZiBfX0tFUk5FTF9fCnR5cGVkZWYgc3RydWN0IGRybV9zYXJlYV9kcmF3YWJsZSBkcm1fc2FyZWFfZHJhd2FibGVfdDsKdHlwZWRlZiBzdHJ1Y3QgZHJtX3NhcmVhX2ZyYW1lIGRybV9zYXJlYV9mcmFtZV90Owp0eXBlZGVmIHN0cnVjdCBkcm1fc2FyZWEgZHJtX3NhcmVhX3Q7CiNlbmRpZgoKI2VuZGlmCQkJCS8qIF9EUk1fU0FSRUFfSF8gKi8K