Lyogdmlzb3JjaGlwc2V0LmgKICoKICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAogKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKICogZGV0YWlscy4KICovCgojaWZuZGVmIF9fVklTT1JDSElQU0VUX0hfXwojZGVmaW5lIF9fVklTT1JDSElQU0VUX0hfXwoKI2luY2x1ZGUgInRpbXNrbW9kLmgiCiNpbmNsdWRlICJjaGFubmVsLmgiCiNpbmNsdWRlICJjb250cm9sdm1jaGFubmVsLmgiCiNpbmNsdWRlICJwYXJzZXIuaCIKI2luY2x1ZGUgInByb2NvYmplY3R0cmVlLmgiCiNpbmNsdWRlICJ2YnVzZGV2aWNlaW5mby5oIgojaW5jbHVkZSAidmJ1c2hlbHBlci5oIgoKLyoqIERlc2NyaWJlcyB0aGUgc3RhdGUgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2Ygd2hpY2ggY29udHJvbHZtIG1lc3NhZ2VzIGhhdmUKICogIGJlZW4gcmVjZWl2ZWQgZm9yIGEgYnVzIG9yIGRldmljZS4KICovCnR5cGVkZWYgc3RydWN0IHsKCVUzMiBjcmVhdGVkOjE7CglVMzIgYXR0YWNoZWQ6MTsKCVUzMiBjb25maWd1cmVkOjE7CglVMzIgcnVubmluZzoxOwoJLyogQWRkIG5ldyBmaWVsZHMgYWJvdmUuICovCgkvKiBSZW1haW5pbmcgYml0cyBpbiB0aGlzIDMyLWJpdCB3b3JkIGFyZSB1bnVzZWQuICovCn0gVklTT1JDSElQU0VUX1NUQVRFOwoKdHlwZWRlZiBlbnVtIHsKCS8qKiBhZGRyZXNzIGlzIGd1ZXN0IHBoeXNpY2FsLCBidXQgb3V0c2lkZSBvZiB0aGUgcGh5c2ljYWwgbWVtb3J5CgkgKiAgcmVnaW9uIHRoYXQgaXMgY29udHJvbGxlZCBieSB0aGUgcnVubmluZyBPUyAodGhpcyBpcyB0aGUgbm9ybWFsCgkgKiAgYWRkcmVzcyB0eXBlIGZvciBTdXBlcnZpc29yIGNoYW5uZWxzKQoJICovCglBRERSVFlQRV9sb2NhbFBoeXNpY2FsLAoKCS8qKiBhZGRyZXNzIGlzIGd1ZXN0IHBoeXNpY2FsLCBhbmQgd2l0aElOIHRoZSBjb25maW5lcyBvZiB0aGUKCSAqICBwaHlzaWNhbCBtZW1vcnkgY29udHJvbGxlZCBieSB0aGUgcnVubmluZyBPUy4KCSAqLwoJQUREUlRZUEVfbG9jYWxUZXN0LAp9IFZJU09SQ0hJUFNFVF9BRERSRVNTVFlQRTsKCnR5cGVkZWYgZW51bSB7CglDUkFTSF9kZXYsCglDUkFTSF9idXMsCn0gQ1JBU0hfT0JKX1RZUEU7CgovKiogQXR0cmlidXRlcyBmb3IgYSBwYXJ0aWN1bGFyIFN1cGVydmlzb3IgY2hhbm5lbC4KICovCnR5cGVkZWYgc3RydWN0IHsKCVZJU09SQ0hJUFNFVF9BRERSRVNTVFlQRSBhZGRyVHlwZTsKCUhPU1RBRERSRVNTIGNoYW5uZWxBZGRyOwoJc3RydWN0IEludGVycnVwdEluZm8gaW50cjsKCVU2NCBuQ2hhbm5lbEJ5dGVzOwoJR1VJRCBjaGFubmVsVHlwZUd1aWQ7CglHVUlEIGNoYW5uZWxJbnN0R3VpZDsKCn0gVklTT1JDSElQU0VUX0NIQU5ORUxfSU5GTzsKCi8qKiBBdHRyaWJ1dGVzIGZvciBhIHBhcnRpY3VsYXIgU3VwZXJ2aXNvciBkZXZpY2UuCiAqICBBbnkgdmlzb3JjaGlwc2V0IGNsaWVudCBjYW4gcXVlcnkgdGhlc2UgYXR0cmlidXRlcyB1c2luZwogKiAgdmlzb3JjaGlwc2V0X2dldF9jbGllbnRfZGV2aWNlX2luZm8oKSBvcgogKiAgdmlzb3JjaGlwc2V0X2dldF9zZXJ2ZXJfZGV2aWNlX2luZm8oKS4KICovCnR5cGVkZWYgc3RydWN0IHsKCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CglVMzIgYnVzTm87CglVMzIgZGV2Tm87CglHVUlEIGRldkluc3RHdWlkOwoJVklTT1JDSElQU0VUX1NUQVRFIHN0YXRlOwoJVklTT1JDSElQU0VUX0NIQU5ORUxfSU5GTyBjaGFuSW5mbzsKCVUzMiBSZXNlcnZlZDE7CQkvKiBDT05UUk9MVk1fSUQgKi8KCVU2NCBSZXNlcnZlZDI7CglVMzIgc3dpdGNoTm87CQkvKiB3aGVuIGRldlN0YXRlLmF0dGFjaGVkPT0xICovCglVMzIgaW50ZXJuYWxQb3J0Tm87CS8qIHdoZW4gZGV2U3RhdGUuYXR0YWNoZWQ9PTEgKi8KCUNPTlRST0xWTV9NRVNTQUdFX0hFQURFUiBwZW5kaW5nTXNnSGRyOwkvKiBDT05UUk9MVk1fTUVTU0FHRSAqLwoJLyoqIEZvciBwcml2YXRlIHVzZSBieSB0aGUgYnVzIGRyaXZlciAqLwoJdm9pZCAqYnVzX2RyaXZlcl9jb250ZXh0OwoKfSBWSVNPUkNISVBTRVRfREVWSUNFX0lORk87CgpzdGF0aWMgaW5saW5lIFZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTyAqCmZpbmRkZXZpY2Uoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgVTMyIGJ1c05vLCBVMzIgZGV2Tm8pCnsKCVZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTyAqcDsKCglsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsIGxpc3QsIGVudHJ5KSB7CgkJaWYgKHAtPmJ1c05vID09IGJ1c05vICYmIHAtPmRldk5vID09IGRldk5vKQoJCQlyZXR1cm4gcDsKCX0KCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgZGVsYnVzZGV2aWNlcyhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBVMzIgYnVzTm8pCnsKCVZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTyAqcDsKCglsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsIGxpc3QsIGVudHJ5KSB7CgkJaWYgKHAtPmJ1c05vID09IGJ1c05vKSB7CgkJCWxpc3RfZGVsKCZwLT5lbnRyeSk7CgkJCWtmcmVlKHApOwoJCX0KCX0KfQoKLyoqIEF0dHJpYnV0ZXMgZm9yIGEgcGFydGljdWxhciBTdXBlcnZpc29yIGJ1cy4KICogIChGb3IgYSBzZXJ2aWNlIHBhcnRpdGlvbiBhY3RpbmcgYXMgdGhlIHNlcnZlciBmb3IgYnVzZXMvZGV2aWNlcywgdGhlcmUKICogIGlzIGEgMS10by0xIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGJ1c3NlcyBhbmQgZ3Vlc3QgcGFydGl0aW9ucy4pCiAqICBBbnkgdmlzb3JjaGlwc2V0IGNsaWVudCBjYW4gcXVlcnkgdGhlc2UgYXR0cmlidXRlcyB1c2luZwogKiAgdmlzb3JjaGlwc2V0X2dldF9jbGllbnRfYnVzX2luZm8oKSBvciB2aXNvcmNoaXBzZXRfZ2V0X2J1c19pbmZvKCkuCiAqLwp0eXBlZGVmIHN0cnVjdCB7CglzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OwoJVTMyIGJ1c05vOwoJVklTT1JDSElQU0VUX1NUQVRFIHN0YXRlOwoJVklTT1JDSElQU0VUX0NIQU5ORUxfSU5GTyBjaGFuSW5mbzsKCUdVSUQgcGFydGl0aW9uR3VpZDsKCVU2NCBwYXJ0aXRpb25IYW5kbGU7CglVOCAqbmFtZTsJCS8qIFVURjggKi8KCVU4ICpkZXNjcmlwdGlvbjsJLyogVVRGOCAqLwoJVTY0IFJlc2VydmVkMTsKCVUzMiBSZXNlcnZlZDI7CglNWVBST0NPQkpFQ1QgKnByb2NPYmplY3Q7CglzdHJ1Y3QgewoJCVUzMiBzZXJ2ZXI6MTsKCQkvKiBBZGQgbmV3IGZpZWxkcyBhYm92ZS4gKi8KCQkvKiBSZW1haW5pbmcgYml0cyBpbiB0aGlzIDMyLWJpdCB3b3JkIGFyZSB1bnVzZWQuICovCgl9IGZsYWdzOwoJQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSIHBlbmRpbmdNc2dIZHI7CS8qIENPTlRST0xWTSBNc2dIZHIgKi8KCS8qKiBGb3IgcHJpdmF0ZSB1c2UgYnkgdGhlIGJ1cyBkcml2ZXIgKi8KCXZvaWQgKmJ1c19kcml2ZXJfY29udGV4dDsKCVU2NCBkZXZObzsKCn0gVklTT1JDSElQU0VUX0JVU19JTkZPOwoKc3RhdGljIGlubGluZSBWSVNPUkNISVBTRVRfQlVTX0lORk8gKgpmaW5kYnVzKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIFUzMiBidXNObykKewoJVklTT1JDSElQU0VUX0JVU19JTkZPICpwOwoKCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgbGlzdCwgZW50cnkpIHsKCQlpZiAocC0+YnVzTm8gPT0gYnVzTm8pCgkJCXJldHVybiBwOwoJfQoJcmV0dXJuIE5VTEw7Cn0KCi8qKiBBdHRyaWJ1dGVzIGZvciBhIHBhcnRpY3VsYXIgU3VwZXJ2aXNvciBzd2l0Y2guCiAqLwp0eXBlZGVmIHN0cnVjdCB7CglVMzIgc3dpdGNoTm87CglWSVNPUkNISVBTRVRfU1RBVEUgc3RhdGU7CglHVUlEIHN3aXRjaFR5cGVHdWlkOwoJVTggKmF1dGhTZXJ2aWNlMTsKCVU4ICphdXRoU2VydmljZTI7CglVOCAqYXV0aFNlcnZpY2UzOwoJVTggKnNlY3VyaXR5Q29udGV4dDsKCVU2NCBSZXNlcnZlZDsKCVUzMiBSZXNlcnZlZDI7CQkvKiBDT05UUk9MVk1fSUQgKi8KCXN0cnVjdCBkZXZpY2UgZGV2OwoJQk9PTCBkZXZfZXhpc3RzOwoJQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSIHBlbmRpbmdNc2dIZHI7Cgp9IFZJU09SQ0hJUFNFVF9TV0lUQ0hfSU5GTzsKCi8qKiBBdHRyaWJ1dGVzIGZvciBhIHBhcnRpY3VsYXIgU3VwZXJ2aXNvciBleHRlcm5hbCBwb3J0LCB3aGljaCBpcyBjb25uZWN0ZWQKICogIHRvIGEgc3BlY2lmaWMgc3dpdGNoLgogKi8KdHlwZWRlZiBzdHJ1Y3QgewoJVTMyIHN3aXRjaE5vOwoJVTMyIGV4dGVybmFsUG9ydE5vOwoJVklTT1JDSElQU0VUX1NUQVRFIHN0YXRlOwoJR1VJRCBuZXR3b3JrWm9uZUd1aWQ7CglpbnQgcGRQb3J0OwoJVTggKmlwOwoJVTggKmlwTmV0bWFzazsKCVU4ICppcEJyb2FkY2FzdDsKCVU4ICppcE5ldHdvcms7CglVOCAqaXBHYXRld2F5OwoJVTggKmlwRE5TOwoJVTY0IFJlc2VydmVkMTsKCVUzMiBSZXNlcnZlZDI7CQkvKiBDT05UUk9MVk1fSUQgKi8KCXN0cnVjdCBkZXZpY2UgZGV2OwoJQk9PTCBkZXZfZXhpc3RzOwoJQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSIHBlbmRpbmdNc2dIZHI7Cgp9IFZJU09SQ0hJUFNFVF9FWFRFUk5BTFBPUlRfSU5GTzsKCi8qKiBBdHRyaWJ1dGVzIGZvciBhIHBhcnRpY3VsYXIgU3VwZXJ2aXNvciBpbnRlcm5hbCBwb3J0LCB3aGljaCBpcyBob3cgYQogKiAgZGV2aWNlIGNvbm5lY3RzIHRvIGEgcGFydGljdWxhciBzd2l0Y2guCiAqLwp0eXBlZGVmIHN0cnVjdCB7CglVMzIgc3dpdGNoTm87CglVMzIgaW50ZXJuYWxQb3J0Tm87CglWSVNPUkNISVBTRVRfU1RBVEUgc3RhdGU7CglVMzIgYnVzTm87CQkvKiB2YWxpZCBvbmx5IHdoZW4gc3RhdGUuYXR0YWNoZWQgPT0gMSAqLwoJVTMyIGRldk5vOwkJLyogdmFsaWQgb25seSB3aGVuIHN0YXRlLmF0dGFjaGVkID09IDEgKi8KCVU2NCBSZXNlcnZlZDE7CglVMzIgUmVzZXJ2ZWQyOwkJLyogQ09OVFJPTFZNX0lEICovCglDT05UUk9MVk1fTUVTU0FHRV9IRUFERVIgcGVuZGluZ01zZ0hkcjsKCU1ZUFJPQ09CSkVDVCAqcHJvY09iamVjdDsKCn0gVklTT1JDSElQU0VUX0lOVEVSTkFMUE9SVF9JTkZPOwoKLyogIFRoZXNlIGZ1bmN0aW9ucyB3aWxsIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB2aXNvcmNoaXBzZXQgd2hlbiBjZXJ0YWluCiAqICBldmVudHMgaGFwcGVuLiAgKFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBmdW5jdGlvbnMgaXMgb3V0c2lkZSBvZgogKiAgdmlzb3JjaGlwc2V0LikKICovCnR5cGVkZWYgc3RydWN0IHsKCXZvaWQgKCpidXNfY3JlYXRlKSh1bG9uZyBidXNObyk7Cgl2b2lkICgqYnVzX2Rlc3Ryb3kpKHVsb25nIGJ1c05vKTsKCXZvaWQgKCpkZXZpY2VfY3JlYXRlKSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8pOwoJdm9pZCAoKmRldmljZV9kZXN0cm95KSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8pOwoJdm9pZCAoKmRldmljZV9wYXVzZSkodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vKTsKCXZvaWQgKCpkZXZpY2VfcmVzdW1lKSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8pOwoJaW50ICgqZ2V0X2NoYW5uZWxfaW5mbykoR1VJRCB0eXBlR3VpZCwgdWxvbmcgKm1pblNpemUsCgkJCQkgdWxvbmcgKm1heFNpemUpOwp9IFZJU09SQ0hJUFNFVF9CVVNERVZfTk9USUZJRVJTOwoKLyogIFRoZXNlIGZ1bmN0aW9ucyBsaXZlIGluc2lkZSB2aXNvcmNoaXBzZXQsIGFuZCB3aWxsIGJlIGNhbGxlZCB0byBpbmRpY2F0ZQogKiAgcmVzcG9uc2VzIHRvIHNwZWNpZmljIGV2ZW50cyAoYnkgY29kZSBvdXRzaWRlIG9mIHZpc29yY2hpcHNldCkuCiAqICBGb3Igbm93LCB0aGUgdmFsdWUgZm9yIGVhY2ggcmVzcG9uc2UgaXMgc2ltcGx5IGVpdGhlcjoKICogICAgICAgMCA9IGl0IHdvcmtlZAogKiAgICAgIC0xID0gaXQgZmFpbGVkCiAqLwp0eXBlZGVmIHN0cnVjdCB7Cgl2b2lkICgqYnVzX2NyZWF0ZSkodWxvbmcgYnVzTm8sIGludCByZXNwb25zZSk7Cgl2b2lkICgqYnVzX2Rlc3Ryb3kpKHVsb25nIGJ1c05vLCBpbnQgcmVzcG9uc2UpOwoJdm9pZCAoKmRldmljZV9jcmVhdGUpKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKTsKCXZvaWQgKCpkZXZpY2VfZGVzdHJveSkodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpOwoJdm9pZCAoKmRldmljZV9wYXVzZSkodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpOwoJdm9pZCAoKmRldmljZV9yZXN1bWUpKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKTsKfSBWSVNPUkNISVBTRVRfQlVTREVWX1JFU1BPTkRFUlM7CgovKiogUmVnaXN0ZXIgZnVuY3Rpb25zIChpbiB0aGUgYnVzIGRyaXZlcikgdG8gZ2V0IGNhbGxlZCBieSB2aXNvcmNoaXBzZXQKICogIHdoZW5ldmVyIGEgYnVzIG9yIGRldmljZSBhcHBlYXJzIGZvciB3aGljaCB0aGlzIHNlcnZpY2UgcGFydGl0aW9uIGlzCiAqICB0byBiZSB0aGUgc2VydmVyIGZvci4gIHZpc29yY2hpcHNldCB3aWxsIGZpbGwgaW4gPHJlc3BvbmRlcnM+LCB0bwogKiAgaW5kaWNhdGUgZnVuY3Rpb25zIHRoZSBidXMgZHJpdmVyIHNob3VsZCBjYWxsIHRvIGluZGljYXRlIG1lc3NhZ2UKICogIHJlc3BvbnNlcy4KICovCnZvaWQKdmlzb3JjaGlwc2V0X3JlZ2lzdGVyX2J1c2Rldl9jbGllbnQoVklTT1JDSElQU0VUX0JVU0RFVl9OT1RJRklFUlMgKm5vdGlmaWVycywKCQkJCSAgICBWSVNPUkNISVBTRVRfQlVTREVWX1JFU1BPTkRFUlMgKnJlc3BvbmRlcnMsCgkJCQkgICAgVUxUUkFfVkJVU19ERVZJQ0VJTkZPICpkcml2ZXJJbmZvKTsKCi8qKiBSZWdpc3RlciBmdW5jdGlvbnMgKGluIHRoZSBidXMgZHJpdmVyKSB0byBnZXQgY2FsbGVkIGJ5IHZpc29yY2hpcHNldAogKiAgd2hlbmV2ZXIgYSBidXMgb3IgZGV2aWNlIGFwcGVhcnMgZm9yIHdoaWNoIHRoaXMgc2VydmljZSBwYXJ0aXRpb24gaXMKICogIHRvIGJlIHRoZSBjbGllbnQgZm9yLiAgdmlzb3JjaGlwc2V0IHdpbGwgZmlsbCBpbiA8cmVzcG9uZGVycz4sIHRvCiAqICBpbmRpY2F0ZSBmdW5jdGlvbnMgdGhlIGJ1cyBkcml2ZXIgc2hvdWxkIGNhbGwgdG8gaW5kaWNhdGUgbWVzc2FnZQogKiAgcmVzcG9uc2VzLgogKi8Kdm9pZAp2aXNvcmNoaXBzZXRfcmVnaXN0ZXJfYnVzZGV2X3NlcnZlcihWSVNPUkNISVBTRVRfQlVTREVWX05PVElGSUVSUyAqbm90aWZpZXJzLAoJCQkJICAgIFZJU09SQ0hJUFNFVF9CVVNERVZfUkVTUE9OREVSUyAqcmVzcG9uZGVycywKCQkJCSAgICBVTFRSQV9WQlVTX0RFVklDRUlORk8gKmRyaXZlckluZm8pOwoKdHlwZWRlZiB2b2lkICgqU1BBUlJFUE9SVEVWRU5UX0NPTVBMRVRFX0ZVTkMpIChDT05UUk9MVk1fTUVTU0FHRSAqbXNnLAoJCQkJCSAgICAgICBpbnQgc3RhdHVzKTsKCnZvaWQgdmlzb3JjaGlwc2V0X2RldmljZV9wYXVzZV9yZXNwb25zZSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sIGludCByZXNwb25zZSk7CgpCT09MIHZpc29yY2hpcHNldF9nZXRfYnVzX2luZm8odWxvbmcgYnVzTm8sIFZJU09SQ0hJUFNFVF9CVVNfSU5GTyAqYnVzSW5mbyk7CkJPT0wgdmlzb3JjaGlwc2V0X2dldF9kZXZpY2VfaW5mbyh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sCgkJCQkgIFZJU09SQ0hJUFNFVF9ERVZJQ0VfSU5GTyAqZGV2SW5mbyk7CkJPT0wgdmlzb3JjaGlwc2V0X2dldF9zd2l0Y2hfaW5mbyh1bG9uZyBzd2l0Y2hObywKCQkJCSAgVklTT1JDSElQU0VUX1NXSVRDSF9JTkZPICpzd2l0Y2hJbmZvKTsKQk9PTCB2aXNvcmNoaXBzZXRfZ2V0X2V4dGVybmFscG9ydF9pbmZvKHVsb25nIHN3aXRjaE5vLCB1bG9uZyBleHRlcm5hbFBvcnRObywKCQkJCQlWSVNPUkNISVBTRVRfRVhURVJOQUxQT1JUX0lORk8KCQkJCQkqZXh0ZXJuYWxQb3J0SW5mbyk7CkJPT0wgdmlzb3JjaGlwc2V0X3NldF9idXNfY29udGV4dCh1bG9uZyBidXNObywgdm9pZCAqY29udGV4dCk7CkJPT0wgdmlzb3JjaGlwc2V0X3NldF9kZXZpY2VfY29udGV4dCh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sIHZvaWQgKmNvbnRleHQpOwppbnQgdmlzb3JjaGlwc2V0X2NoaXBzZXRfcmVhZHkodm9pZCk7CmludCB2aXNvcmNoaXBzZXRfY2hpcHNldF9zZWxmdGVzdCh2b2lkKTsKaW50IHZpc29yY2hpcHNldF9jaGlwc2V0X25vdHJlYWR5KHZvaWQpOwp2b2lkIHZpc29yY2hpcHNldF9jb250cm9sdm1fcmVzcG9uZF9yZXBvcnRFdmVudChDT05UUk9MVk1fTUVTU0FHRSAqbXNnLAoJCQkJCQl2b2lkICpwYXlsb2FkKTsKdm9pZCB2aXNvcmNoaXBzZXRfc2F2ZV9tZXNzYWdlKENPTlRST0xWTV9NRVNTQUdFICptc2csIENSQVNIX09CSl9UWVBFIHR5cGUpOwp2b2lkICp2aXNvcmNoaXBzZXRfY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKnBvb2wsCgkJCSAgICAgICBCT09MIG9rX3RvX2Jsb2NrLCBjaGFyICpmbiwgaW50IGxuKTsKdm9pZCB2aXNvcmNoaXBzZXRfY2FjaGVfZnJlZShzdHJ1Y3Qga21lbV9jYWNoZSAqcG9vbCwgdm9pZCAqcCwKCQkJICAgICBjaGFyICpmbiwgaW50IGxuKTsKCiNpZiBkZWZpbmVkKFRSQU5TTUlURklMRV9ERUJVRykgfHwgZGVmaW5lZChERUJVRykKI2RlZmluZSBEQkdfR0VURklMRV9QQVlMT0FEKG1zZywgY29udHJvbHZtX2hlYWRlcikgICAgICBcCglMT0dJTkYobXNnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCgkgICAgICAgKHVsb25nKWNvbnRyb2x2bV9oZWFkZXIuUGF5bG9hZFZtT2Zmc2V0LCBcCgkgICAgICAgKHVsb25nKWNvbnRyb2x2bV9oZWFkZXIuUGF5bG9hZE1heEJ5dGVzKQojZGVmaW5lIERCR19HRVRGSUxFKGZtdCwgLi4uKSAgTE9HSU5GKGZtdCwgIyNfX1ZBX0FSR1NfXykKI2RlZmluZSBEQkdfUFVURklMRShmbXQsIC4uLikgIExPR0lORihmbXQsICMjX19WQV9BUkdTX18pCiNlbHNlCiNkZWZpbmUgREJHX0dFVEZJTEVfUEFZTE9BRChtc2csIGNvbnRyb2x2bV9oZWFkZXIpCiNkZWZpbmUgREJHX0dFVEZJTEUoZm10LCAuLi4pCiNkZWZpbmUgREJHX1BVVEZJTEUoZm10LCAuLi4pCiNlbmRpZgoKI2VuZGlmCg==