LyoKICogTkRBIEFORCBORUVELVRPLUtOT1cgUkVRVUlSRUQKICoKICogQ29weXJpZ2h0IKkgMjAxMy0yMDE4IFN5bmFwdGljcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiB0aGF0IGlzIHByb3ByaWV0YXJ5IHRvIFN5bmFwdGljcwogKiBJbmNvcnBvcmF0ZWQgKCJTeW5hcHRpY3MiKS4gVGhlIGhvbGRlciBvZiB0aGlzIGZpbGUgc2hhbGwgdHJlYXQgYWxsCiAqIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gYXMgY29uZmlkZW50aWFsLCBzaGFsbCB1c2UgdGhlCiAqIGluZm9ybWF0aW9uIG9ubHkgZm9yIGl0cyBpbnRlbmRlZCBwdXJwb3NlLCBhbmQgc2hhbGwgbm90IGR1cGxpY2F0ZSwKICogZGlzY2xvc2UsIG9yIGRpc3NlbWluYXRlIGFueSBvZiB0aGlzIGluZm9ybWF0aW9uIGluIGFueSBtYW5uZXIKICogdW5sZXNzIFN5bmFwdGljcyBoYXMgb3RoZXJ3aXNlIHByb3ZpZGVkIGV4cHJlc3MsIHdyaXR0ZW4KICogcGVybWlzc2lvbi4KICoKICogVXNlIG9mIHRoZSBtYXRlcmlhbHMgbWF5IHJlcXVpcmUgYSBsaWNlbnNlIG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eQogKiBmcm9tIGEgdGhpcmQgcGFydHkgb3IgZnJvbSBTeW5hcHRpY3MuIFRoaXMgZmlsZSBjb252ZXlzIG5vIGV4cHJlc3MKICogb3IgaW1wbGllZCBsaWNlbnNlcyB0byBhbnkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBiZWxvbmdpbmcKICogdG8gU3luYXB0aWNzLgogKgogKiBJTkZPUk1BVElPTiBDT05UQUlORUQgSU4gVEhJUyBET0NVTUVOVCBJUyBQUk9WSURFRCAiQVMtSVMsIiBBTkQKICogU1lOQVBUSUNTIEVYUFJFU1NMWSBESVNDTEFJTVMgQUxMIEVYUFJFU1MgQU5EIElNUExJRUQgV0FSUkFOVElFUywKICogSU5DTFVESU5HIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgogKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQU5EIEFOWSBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQgT0YgQU5ZCiAqIElOVEVMTEVDVFVBTCBQUk9QRVJUWSBSSUdIVFMuIElOIE5PIEVWRU5UIFNIQUxMIFNZTkFQVElDUyBCRSBMSUFCTEUKICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBQVU5JVElWRSwgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFCiAqIE9GIFRIRSBJTkZPUk1BVElPTiBDT05UQUlORUQgSU4gVEhJUyBET0NVTUVOVCwgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIEJBU0VEIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKICogTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFORCBFVkVOIElGIFNZTkFQVElDUyBXQVMKICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIElGIEEgVFJJQlVOQUwgT0YKICogQ09NUEVURU5UIEpVUklTRElDVElPTiBET0VTIE5PVCBQRVJNSVQgVEhFIERJU0NMQUlNRVIgT0YgRElSRUNUCiAqIERBTUFHRVMgT1IgQU5ZIE9USEVSIERBTUFHRVMsIFNZTkFQVElDUycgVE9UQUwgQ1VNVUxBVElWRSBMSUFCSUxJVFkKICogVE8gQU5ZIFBBUlRZIFNIQUxMIE5PVCBFWENFRUQgT05FIEhVTkRSRUQgVS5TLiBET0xMQVJTLgogKi8KI2lmbmRlZiBfX0xJQkZEVF9NUlZMX0hfXwojZGVmaW5lIF9fTElCRkRUX01SVkxfSF9fCgojaW5jbHVkZSAiY29tX3R5cGUuaCIKCiNkZWZpbmUgTlJfQkFOS1MgICAgICAgICAgICAgICAgOAoKdHlwZWRlZiBzdHJ1Y3Qgc3lzdGVtX2luZm9fdCB7Cgl1bnNpZ25lZCBpbnQgc3lzdGVtX3NlcmlhbF9sb3c7Cgl1bnNpZ25lZCBpbnQgc3lzdGVtX3NlcmlhbF9oaWdoOwoJdW5zaWduZWQgaW50IGNoaXBfdmVyOwoJdW5zaWduZWQgaW50IGxlYWthZ2VfY3VycmVudDsKCXVuc2lnbmVkIGludCB0ZW1wX2lkOwoJdW5zaWduZWQgaW50IGNoaXBfdGltZXN0YW1wOwoJdW5zaWduZWQgaW50IHBjaWVfZGlzYWJsZTsKCXVuc2lnbmVkIGludCBwdmNvbXBfcmV2OwoJdW5zaWduZWQgaW50IGxlYWthZ2VfY3VycmVudF92MTsKCXVuc2lnbmVkIGludCB0ZW1wX2lkX3YxOwoJdW5zaWduZWQgaW50IGxlYWthZ2VfY3VycmVudF92MjsKCXVuc2lnbmVkIGludCB0ZW1wX2lkX3YyOwp9IHN5c3RlbV9pbmZvX3Q7CgppbnQgc2V0X2ZkdCh2b2lkICpmZHQsIGludCB0b3RhbF9zcGFjZSx1bnNpZ25lZCBpbnQgaW5pdHJkX3N0YXJ0LHVuc2lnbmVkIGludCBpbml0cmRfc2l6ZSxjaGFyICogY21kbGluZSk7Cgp2b2lkIGZkdF9zZXRfcmVzZXJ2ZWRfbWVtKHZvaWQgKmZkdCwgdW5zaWduZWQgaW50IGFkZHJlc3MsIHVuc2lnbmVkIGludCBzaXplKTsKCnZvaWQgc2V0X2ZkdF9hZGRyKHVuc2lnbmVkIGludCBmZHQsIGludCB0b3RhbF9zcGFjZSk7CmludCBnZXRfZmR0X2FkZHIodW5zaWduZWQgaW50ICpmZHQsIGludCAqIHRvdGFsX3NwYWNlKTsKCmludCBmZHRfYWRkX3N5c3RlbV9pbmZvKHZvaWQgKmZkdCwKCQlpbnQgdG90YWxfc3BhY2UsCgkJY29uc3QgY2hhciAqcG5vZGUsCgkJY29uc3Qgc3lzdGVtX2luZm9fdCAqc3lzdGVtX2luZm8pOwoKaW50IGZkdF91cGRhdGVfaTJjX3NsYXZlX2FkZHIodm9pZCAqZmR0LCBpbnQgdG90YWxfc3BhY2UsIHVuc2lnbmVkIGludCBtYXN0ZXJpZCwgdW5zaWduZWQgaW50IHNsYXZlX2FkZHIpOwppbnQgZmR0X2FkZF9vcHAodm9pZCAqZmR0LCBpbnQgdG90YWxfc3BhY2UsIHVuc2lnbmVkIGludCAqIG9wcCwgaW50IGNvdW50KTsKdm9pZCBmZHRfc2V0X3ZjcHVfb3BwKHZvaWQgKiBmZHQsIHVuc2lnbmVkIGludCB2aCwgdW5zaWduZWQgaW50IHZsKTsKdm9pZCBmZHRfc2V0X3Zjb3JlX29wcCh2b2lkICogZmR0LCB1bnNpZ25lZCBpbnQgdmNvcmVoLCB1bnNpZ25lZCBpbnQgdmNvcmVsKTsKaW50IGZkdF9zZXRfbGVha2FnZSh2b2lkICpmZHQsIGludCB0b3RhbF9zcGFjZSwgdW5zaWduZWQgaW50IGxlYWthZ2VfbnVtKTsKaW50IGZkdF9zZXRfY2hpcF9yZXYodm9pZCAqZmR0LCBpbnQgdG90YWxfc3BhY2UsIHVuc2lnbmVkIGludCBjaGlwX3Jldik7CnZvaWQgZmR0X3NlbGVjdF9wbWljKHZvaWQgKmZkdCk7CnZvaWQgZmR0X3NldF9tZW1vcnkodm9pZCAqZmR0LCB1bnNpZ25lZCBpbnQgbWVtb3J5X3NpemUpOwp2b2lkIGZkdF9zZXRfcmFtb29wcyh2b2lkICpmZHQsIHVuc2lnbmVkIGludCBtZW1vcnlfc2l6ZSk7CiNlbmRpZiAvKiBfX0xJQkZEVF9NUlZMX0hfXyAqLwo=